[Modul] Logitech Gxxx (LCD) [WIN]

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

[Modul] Logitech Gxxx (LCD) [WIN]

Beitrag von Imhotheb »

Grüße Zusammen,

hier ein Modul für die beiden LCD's von Logitech (Monochrom/RGB) (G15, G13, G19, etc.).
Damit lassen sich die LCD's einfach ansteuern und verwenden.

Funktioniert mit PB5.41, 32/64Bit, Unicode oder Ascii, ob es ohne Threadsafe läuft, bin ich mir unsicher.

Und wie immer ... Fragen? Kritik? Verbesserungsvorschläge? ... immer her damit.

Das Modul ist noch nicht vollständig und demnächst möchte ich noch G-Tasten, Belauchtung und vielleicht ARX hinzufügen.

Viel Spass

Code: Alles auswählen

  CompilerIf #PB_Compiler_OS <> #PB_OS_Windows
   CompilerError "<Logitech.pbi> Windows only"
 CompilerEndIf
DeclareModule Logitech_Common

  Declare CreatePxArray(Image, Width, Heigth, Mono, Alpha)  
  Macro FreePxArray(_Ptr_)                                            ; free memory of pixes-array
    FreeMemory(_Ptr_)
  EndMacro
  
  Declare.s GetLCorePath()          ; try to find the location of "LCore.exe", logitech's keyb/mouse software
  
  Declare Dummy()                   ; reserved
  
EndDeclareModule
Module Logitech_Common 

  Procedure.s GetLCorePath()
    Protected Ret.s
    
    ; i know ... a little clueless
    Ret = GetEnvironmentVariable("ProgramFiles")
    Ret + "\Logitech Gaming Software"
    
    ProcedureReturn Ret
  EndProcedure
   
  Procedure CreatePxArray(Image, Width, Heigth, Mono, Alpha)
    Protected *Ret, Img, x, y, Size, Color, *Ptr.Ascii    
    
    ; calculate memory needed for mone or color lcd
    If Mono = #False
      Size = Width * Heigth * 4
    Else
      Size = Width * Heigth ; * 1
    EndIf
    
    ; some checks if image exists and is big enougth
    If IsImage(Image)
      If ImageHeight(Image) >= Heigth And ImageWidth(Image) >= Width
        Img = GrabImage(Image, #PB_Any, 0, 0, Width, Heigth)        ; i think it's saver to copy the image, but dont know
        If Img
          
          ; override alpha if there is no alpha-channel
          If ImageDepth(Img) < 32
            Alpha = 255
          EndIf          
          
          *Ret = AllocateMemory(Size)
          If *Ret
            
            StartDrawing(ImageOutput(Img))
            DrawingMode(#PB_2DDrawing_AlphaBlend)
            For y = 0 To Heigth - 1
              For x = 0 To Width - 1
                Color = Point(x, y)                   ; take color of pb-image
                If Mono = #False                      ; color-lcd
                  ;write 4 Byte (BGRA)
                  *Ptr = *Ret + (y * Width + x) * 4   ; calc location in memory
                  PokeA(*Ptr, Blue(Color))            ; maybe its faster to use "*Ptr\a = " ?
                  PokeA(*Ptr + 1, Green(Color))
                  PokeA(*Ptr + 2, Red(Color))
                  If Alpha < 0                        
                    PokeA(*Ptr + 3, Alpha(Color))
                  Else
                    PokeA(*Ptr + 3, Alpha)
                  EndIf
                Else                                  ; mono-lcd
                  *Ptr = *Ret + (y * Width + x)
                  If Color
                    PokeA(*Ret, 255)
                  Else
                    PokeA(*Ret, 0)
                  EndIf
                EndIf
                
              Next x
            Next y
            StopDrawing()
          EndIf         
          
        EndIf
      EndIf
    EndIf
    
    ProcedureReturn *Ret    
  EndProcedure 
    
  Procedure Dummy()
    ProcedureReturn #False
  EndProcedure
  
EndModule

DeclareModule LCD

  #TYPE_Mono             = %1                    ;= &00000001
  #TYPE_Color            = %10                   ;= &00000002
  
  #BUTTON_Mono_0         = %1                    ;= &00000001
  #BUTTON_Mono_1         = %10                   ;= &00000002
  #BUTTON_Mono_2         = %100                  ;= &00000004
  #BUTTON_Mono_3         = %1000                 ;= &00000008
  
  #BUTTON_Color_Left     = %100000000            ;= &00000100
  #BUTTON_Color_Right    = %1000000000           ;= &00000200
  #BUTTON_Color_Ok       = %10000000000          ;= &00000400
  #BUTTON_Color_Cancel   = %100000000000         ;= &00000800
  #BUTTON_Color_Up       = %1000000000000        ;= &00001000
  #BUTTON_Color_Down     = %10000000000000       ;= &00002000
  #BUTTON_Color_Menu     = %100000000000000      ;= &00004000
  
  #WIDTH_Mono            = 160;
  #HEIGTH_Mono           = 43 ;
  #MAXLINE_Mono          = 3
  
  #WIDTH_Color           = 320;
  #HEIGTH_Color          = 240;
  #MAXLINE_Color         = 7
  
  Declare Init(AppName$ = "", DLL$ = "LogitechLcd.dll", Type = LCD::#TYPE_Color | LCD::#TYPE_Mono)
  ; AppName = name of your app ... who could have guessed that?
  ; DLL$ = Path to LogitechLcd.dll ... most located at "C:\Program Files\Logitech Gaming Software\SDK\LCD\<youre arch>\LogitechLcd.dll"
  ;         you can try LCD:GetLCD_DLL_Path()
  ; Type = one or both type of lcd ... doesn't matter if it is connected
  
  
  Declare Free()
  ; clean up, free resources, close dll, etc.
  
  Declare.s GetLCD_DLL_Path()
  ; this function isnt very tricky
  
  PrototypeC LogiLcdColorSetBackground(*Color_Bitmap)
  ; use CreatePxArray() to create *Color_Bitmap
  
  PrototypeC LogiLcdColorSetText(LineNbr, Text.p-Unicode, Red = 255, Green = 255, Blue = 255)
  ;                LineNbr can be 0 to 7 
  ;                Text ... if its too long, it will be truncated
  ;                Red / Green / Blue ... Values from 0 to 255
  
  PrototypeC LogiLcdColorSetTitle(Text.p-unicode, Red, Green, Blue)
  ;                Same as SetText() ... but its the first Line in bigger letters
  
  PrototypeC LogiLcdIsButtonPressed(Button)
  ;                discover any pressed buttons on mono or color lcd
  
  PrototypeC LogiLcdIsConnected(Type)
  ;                use #TYPE_Mono, #TYPE_Color or both with "|"
  ;                #true if available
  
  PrototypeC LogiLcdMonoSetBackground(*Mono_Bitmap)
  ;                same as the one for color lcd ... but different pixmap 
  ;                ... use mono = #True in CreatePxArray()
  
  
  PrototypeC LogiLcdMonoSetText(Line, Text.p-unicode)
  ;                LineNbr can be 0 to 3 
  ;                Text ... if its too long, it will be truncated
  
  PrototypeC LogiLcdUpdate()
  ;       you have to use this in your main-loop to update the lcd(s)
  
  
  
  ; Description see above ... Disabled before Init() successed
  Global Color_SetBackground.LogiLcdColorSetBackground        = Logitech_Common::@Dummy()
  Global Color_SetText.LogiLcdColorSetText                    = Logitech_Common::@Dummy()
  Global Color_SetTitle.LogiLcdColorSetTitle                  = Logitech_Common::@Dummy()
  Global IsButtonPressed.LogiLcdIsButtonPressed               = Logitech_Common::@Dummy()
  Global IsConnected.LogiLcdIsConnected                       = Logitech_Common::@Dummy()
  Global Mono_SetBackground.LogiLcdMonoSetBackground          = Logitech_Common::@Dummy()
  Global Mono_SetText.LogiLcdMonoSetText                      = Logitech_Common::@Dummy()
  Global Update.LogiLcdUpdate                                 = Logitech_Common::@Dummy()
  
  Macro CreatePxArray(_Image_, _Width_ = LCD::#WIDTH_Color, _Heigth_ = LCD::#HEIGTH_Color, _Mono_ = #False, _Alpha_ = -1)
    Logitech_Common::CreatePxArray(_Image_, _Width_, _Heigth_, _Mono_, _Alpha_)
  EndMacro
            ; create logitech combatible pixel-array
            ; Image = pb's "#Image"
            ; if mono = #true, create mono  combatibel pixmap
            ; set Alpha to override Alpha
  
  
  Macro FreePxArray(_Ptr_)        ; free resurces reserved for pixmap
    Logitech_Common::FreePxArray(_Ptr_)
  EndMacro
  Macro Color_IsConnected()       ; true if color-lcd  is connected
    LCD::IsConnected(LCD::#TYPE_Color)
  EndMacro
  Macro Mono_IsConnected()        ; true if mono-lcd is connected
    LCD::IsConnected(LCD::#TYPE_Mono)
  EndMacro
  
EndDeclareModule

Module LCD
  EnableExplicit  
  
  PrototypeC LogiLcdInit(AppName$, Type)
  PrototypeC LogiLcdShutdown()
  
  Global LcdInit.LogiLcdInit                = Logitech_Common::@Dummy()
  Global LcdShutdown.LogiLcdShutdown        = Logitech_Common::@Dummy()
  Global hDLL
  
  Procedure.s GetLCD_DLL_Path()
    Protected Ret.s, Arch.s
    
    ; not very smart, i know ...
    
    If #PB_Compiler_Processor = #PB_Processor_x86
      Arch = "x86"
    Else
      Arch = "x64"
    EndIf
    
    Ret = Logitech_Common::GetLCorePath()
    Ret + "\SDK\LCD\" + Arch + "\LogitechLCD.dll"
    
    ProcedureReturn Ret
  EndProcedure
  
  Procedure Init(AppName$ = "", DLL$ = "LogitechLcd.dll", Type = LCD::#TYPE_Color | LCD::#TYPE_Mono)
    
    hDLL = OpenLibrary(#PB_Any, DLL$)
    If hDLL
      
      Color_SetBackground = GetFunction(hDLL, "LogiLcdColorSetBackground")
      Color_SetText = GetFunction(hDLL, "LogiLcdColorSetText")
      Color_SetTitle = GetFunction(hDLL, "LogiLcdColorSetTitle")
      IsButtonPressed = GetFunction(hDLL, "LogiLcdIsButtonPressed")
      IsConnected = GetFunction(hDLL, "LogiLcdIsConnected")
      Mono_SetBackground = GetFunction(hDLL, "LogiLcdMonoSetBackground")
      Mono_SetText = GetFunction(hDLL, "LogiLcdMonoSetText")
      Update = GetFunction(hDLL, "LogiLcdUpdate")
      LcdInit = GetFunction(hDLL, "LogiLcdInit")
      LcdShutdown = GetFunction(hDLL, "LogiLcdShutdown")
      
      ProcedureReturn LcdInit(AppName$, Type)
    EndIf
    
    ProcedureReturn #False
  EndProcedure
  Procedure Free()
    
    ; shut down lcd
    If LcdShutdown
      LcdShutdown()
    EndIf
    
    ; close library
    If hDLL
      If IsLibrary(hDLL)
        CloseLibrary(hDLL)
      EndIf
    EndIf
    
    ; disable functions
    Color_SetBackground           = Logitech_Common::@Dummy()
    Color_SetText                 = Logitech_Common::@Dummy()
    Color_SetTitle                = Logitech_Common::@Dummy()
    IsButtonPressed               = Logitech_Common::@Dummy()
    IsConnected                   = Logitech_Common::@Dummy()
    Mono_SetBackground            = Logitech_Common::@Dummy()
    Mono_SetText                  = Logitech_Common::@Dummy()
    Update                        = Logitech_Common::@Dummy()
    LcdInit                       = Logitech_Common::@Dummy()
    LcdShutdown                   = Logitech_Common::@Dummy()

  EndProcedure
    
EndModule

CompilerIf #PB_Compiler_IsMainFile
  EnableExplicit
  UsePNGImageDecoder()
  
  Enumeration Images
    #Color_BG
    #PB_Logo
    #Mono_BG
  EndEnumeration
  #LogoW = 48
  #LogoH = 48
  
  Declare ColorBG(Img, Speed = 1)       ; do some animations
  #AppName = "Logitech LCD Test"
  
  Define *ColorPxArray, *MonoPxArray, *MonoPxArray2, Button.s, DLL_Path.s
  Define i, y, x, c
  
  ; create a backgroundimage and load icon
  CreateImage(#Color_BG, LCD::#WIDTH_Color, LCD::#WIDTH_Color, 24, #Black)
  CatchImage(#PB_Logo, ?PB_Logo)
  
  ; create two backgrounds for mono lcd ... we can LCD::CreatePxArray()
  *MonoPxArray = AllocateMemory(LCD::#HEIGTH_Mono * LCD::#WIDTH_Mono)
  *MonoPxArray2 = AllocateMemory(LCD::#HEIGTH_Mono * LCD::#WIDTH_Mono)
  For y = 0 To LCD::#HEIGTH_Mono - 1
    For x = 0 To LCD::#WIDTH_Mono - 1
      If x % 2 = 0 And Not y % 2
        c = 255
       Else      
        c = 0
      EndIf      
      PokeA(*MonoPxArray + y * LCD::#WIDTH_Mono + x, c)
      If x % 4 = 0 And y % 4 = 0
        c = 255
       Else      
        c = 0
      EndIf      
      PokeA(*MonoPxArray2 + y * LCD::#WIDTH_Mono + x, c)
    Next x
  Next y
  
  ; try to get location of dll and initialize it
  Logitech_Common::GetLCorePath()
  DLL_Path = LCD::GetLCD_DLL_Path()
  LCD::Init(#AppName, DLL_Path)
  
  
  ; now we can put some text on lcd
  LCD::Color_SetTitle(#AppName, 255, 0, 0)
  LCD::Color_SetText(0, "Line 1 ... Blue", 0, 0, 255)
  LCD::Color_SetText(1, "Line 2 ... Green", 0, 255, 0)
  LCD::Color_SetText(2, "Line 3 ... Yellow", 255, 255, 0)
  LCD::Color_SetText(LCD::#MAXLINE_Color, "Press <Back> to Quit", 0, 0, 0)
  
  If LCD::Color_IsConnected()
    LCD::Color_SetText(3, "Found Color LCD", 255, 128, 64)
    LCD::Mono_SetText(0, "Found Color LCD")
  EndIf
  If LCD::Mono_IsConnected()
    LCD::Color_SetText(4, "Found Mono LCD", 128, 128, 128)
    LCD::Mono_SetText(1, "Found Mono LCD")
  EndIf
  
  LCD::Mono_SetText(LCD::#MAXLINE_Mono, "  BTN0     BTN1     BTN2      Quit")
  
  
  Repeat
    If i < 1
      i = 1
    ElseIf i > 16
      i = 16
    EndIf
    
    ; little dynamic on lcd
    LCD::Color_SetText(5, "Speed: " + Str(i) + " " + RSet("", i, Chr(187)), i * 16 - 1, 255 - i * 16, 0)
    ; create new background for color lcd
    ColorBG(#Color_BG, i)
    ; convert it to pixmap
    *ColorPxArray = LCD::CreatePxArray(#Color_BG)
    ; set new background
    LCD::Color_SetBackground(*ColorPxArray)
    ; free pixmap
    LCD::FreePxArray(*ColorPxArray)    
    
    
    
    ; do somthing with buttons (mono)
    Button = ""
    If LCD::IsButtonPressed(LCD::#BUTTON_Mono_0)
      Button + "0 "
      LCD::Mono_SetBackground(*MonoPxArray)
    EndIf  
    If LCD::IsButtonPressed(LCD::#BUTTON_Mono_1)
      Button + "1 "
      LCD::Mono_SetBackground(*MonoPxArray2)
    EndIf
    If LCD::IsButtonPressed(LCD::#BUTTON_Mono_2)
      Button + "2 "
      LCD::Mono_SetBackground(0)
    EndIf  
    If LCD::IsButtonPressed(LCD::#BUTTON_Mono_3)
      Break
    EndIf    
    If Button = ""
      Button = "Buttons: NONE"
    Else
      Button = "Buttons: " + Button
    EndIf
    LCD::Mono_SetText(2, Button)      
    
    
    
    ; do somthing with buttons (color)
    Button = ""
    If LCD::IsButtonPressed(LCD::#BUTTON_Color_Ok)
      Button + "OK "
    EndIf    
    If LCD::IsButtonPressed(LCD::#BUTTON_Color_Up)
      i + 1
      Button + "UP "
    EndIf    
    If LCD::IsButtonPressed(LCD::#BUTTON_Color_Down)
      i - 1
      Button + "DOWN "
    EndIf    
    If LCD::IsButtonPressed(LCD::#BUTTON_Color_Left)
      Button + "LEFT "
    EndIf    
    If LCD::IsButtonPressed(LCD::#BUTTON_Color_Right)      
      Button + "RIGHT "
    EndIf    
    If LCD::IsButtonPressed(LCD::#BUTTON_Color_Menu)      
      i = 1
      Button + "MENU "
    EndIf    
    If LCD::IsButtonPressed(LCD::#BUTTON_Color_Cancel)
      Break
    EndIf       
    If Button = ""
      Button = "Buttons: NONE"
    Else
      Button = "Buttons: " + Button
    EndIf
    LCD::Color_SetText(6, Button)      
    
    ; update lcd ... same as FlipBuffers() ... i think ^^
    LCD::Update()
  ForEver
  
  ; free resources and quit
  LCD::Free()
  LCD::FreePxArray(*MonoPxArray)
  LCD::FreePxArray(*MonoPxArray2)
  
  Procedure ColorBG(Img, Speed = 1)
    Protected XMid, Y3rd
    Static LogoX, LogoY, DirX = 1, DirY = 1
    Static C
    
    ; mix colors
    If c < $FF
      c + 1
    ElseIf c < $FF00
      c + $100
      c - 1
    ElseIf c < $FF0000
      c + $10000
      c - $100
    ElseIf c > $FE0000
      c = 0
    EndIf    
    
    ; calc direction
    If DirX > 0
      If LogoX >= LCD::#WIDTH_Color - #LogoW - Speed
        DirX = -1
      EndIf
    ElseIf DirX < 0    
      If LogoX < 0    
        DirX = 1
      EndIf
    EndIf
    If DirY > 0
      If LogoY >= LCD::#HEIGTH_Color - #LogoH - Speed
        DirY = -1
      EndIf
    ElseIf DirY < 0  
      If LogoY < 0    
        DirY = 1
      EndIf
    EndIf
    
    LogoX + DirX * Speed  
    LogoY + DirY * Speed
    
    
    ; draw box with gradient and pb-logo
    If IsImage(Img)
      If StartDrawing(ImageOutput(Img))
        XMid = LCD::#WIDTH_Color / 2 - 1
        Y3rd = LCD::#HEIGTH_Color / 1.5 - 1
        DrawingMode(#PB_2DDrawing_Gradient)
        FrontColor(0)
        BackColor(c)
        LinearGradient(XMid, LCD::#HEIGTH_Color - 1, XMid, Y3rd)
        Box(0, 0, LCD::#WIDTH_Color, LCD::#HEIGTH_Color)        
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        DrawImage(ImageID(#PB_Logo), LogoX, LogoY)
        StopDrawing()
        ProcedureReturn #True
      EndIf
    EndIf
    
    ProcedureReturn #False
  EndProcedure
  
  DataSection
  PB_Logo:
    Data.b $89,$50,$4E,$47,$0D,$0A,$1A,$0A,$00,$00,$00,$0D,$49,$48,$44,$52
    Data.b $00,$00,$00,$30,$00,$00,$00,$30,$08,$06,$00,$00,$00,$57,$02,$F9
    Data.b $87,$00,$00,$00,$09,$70,$48,$59,$73,$00,$00,$1C,$20,$00,$00,$1C
    Data.b $20,$01,$CD,$0F,$9B,$9E,$00,$00,$00,$07,$74,$49,$4D,$45,$07,$D6
    Data.b $0C,$1C,$15,$17,$0D,$B6,$53,$C9,$04,$00,$00,$0C,$9C,$49,$44,$41
    Data.b $54,$68,$DE,$D5,$99,$79,$8C,$5D,$D7,$5D,$C7,$3F,$E7,$9C,$7B,$EF
    Data.b $5B,$E6,$BD,$D9,$17,$CF,$E2,$78,$A9,$27,$09,$B6,$A2,$26,$71,$90
    Data.b $93,$8A,$2C,$60,$D2,$02,$6D,$54,$94,$96,$48,$24,$6D,$11,$55,$55
    Data.b $05,$A5,$40,$25,$4A,$04,$52,$A1,$82,$06,$A9,$8A,$10,$02,$A1,$A6
    Data.b $34,$40,$45,$CB,$2A,$0A,$51,$A0,$B4,$84,$2C,$4E,$52,$E3,$6C,$B6
    Data.b $C7,$F6,$64,$C6,$19,$7B,$16,$8F,$67,$5F,$DF,$BE,$DF,$77,$CF,$E1
    Data.b $8F,$7B,$66,$3C,$36,$89,$ED,$B1,$C7,$48,$1C,$E9,$E8,$5E,$DD,$27
    Data.b $BD,$FB,$FB,$9E,$DF,$F6,$FD,$FE,$AE,$62,$8B,$56,$4B,$3C,$2A,$9E
    Data.b $79,$F4,$A1,$96,$87,$F6,$DF,$D6,$11,$53,$2A,$32,$B6,$94,$52,$81
    Data.b $D6,$0E,$A0,$00,$B9,$61,$0B,$BB,$B9,$E4,$FE,$9A,$96,$D8,$22,$FB
    Data.b $C5,$F4,$23,$0F,$7E,$B9,$51,$D7,$FF,$D8,$F1,$5C,$29,$1C,$15,$18
    Data.b $29,$2B,$06,$72,$46,$90,$D1,$82,$4C,$A0,$C9,$D4,$B5,$49,$D7,$11
    Data.b $E9,$BA,$54,$99,$9A,$A3,$D2,$15,$A9,$D2,$45,$44,$2A,$A7,$4D,$7A
    Data.b $36,$5F,$4A,$1D,$3E,$37,$93,$7E,$73,$72,$B6,$70,$66,$25,$E5,$07
    Data.b $DA,$68,$60,$6D,$07,$F6,$7A,$63,$00,$9C,$79,$E2,$D1,$9B,$55,$A6
    Data.b $30,$50,$74,$DD,$06,$E3,$07,$18,$BF,$8E,$30,$06,$61,$C0,$51,$02
    Data.b $E5,$39,$38,$9E,$83,$F2,$5C,$1C,$C7,$C5,$95,$02,$19,$F8,$50,$2E
    Data.b $41,$AD,$82,$10,$E0,$7A,$11,$94,$E7,$82,$52,$B5,$74,$AE,$58,$D0
    Data.b $F9,$6A,$26,$55,$F5,$8F,$DC,$F9,$C3,$D7,$9E,$06,$E6,$81,$8C,$05
    Data.b $72,$D1,$72,$AE,$D7,$F8,$87,$6F,$DE,$A1,$A2,$E9,$FC,$B7,$A7,$CF
    Data.b $4F,$37,$68,$40,$1B,$83,$36,$60,$08,$37,$F6,$AA,$0D,$04,$1A,$02
    Data.b $6D,$D0,$08,$94,$1B,$C5,$69,$6A,$C2,$69,$6C,$42,$7A,$1E,$A2,$0A
    Data.b $C2,$57,$4C,$8D,$0C,$7A,$1D,$41,$AD,$75,$5F,$57,$57,$FC,$E1,$D7
    Data.b $DE,$01,$B8,$17,$78,$1D,$28,$DC,$10,$00,$7F,$76,$FF,$81,$2F,$2E
    Data.b $9C,$9D,$78,$C0,$6C,$74,$AB,$00,$63,$42,$F7,$5E,$78,$6E,$C2,$80
    Data.b $17,$20,$8D,$41,$FB,$15,$AA,$2B,$15,$CA,$2B,$4B,$61,$6C,$08,$45
    Data.b $C1,$D4,$89,$F9,$25,$F6,$DF,$B4,$DD,$FC,$C2,$91,$E3,$E9,$C9,$62
    Data.b $69,$9B,$B5,$B1,$F6,$7E,$C6,$63,$93,$EA,$9A,$D7,$D0,$AF,$3D,$BA
    Data.b $33,$37,$B3,$F0,$8D,$AA,$EF,$83,$31,$18,$13,$9A,$6B,$36,$A2,$31
    Data.b $1B,$1E,$08,$90,$02,$A4,$B4,$5B,$80,$14,$06,$25,$C0,$77,$14,$54
    Data.b $0A,$3C,$B0,$BD,$8F,$2F,$9D,$1A,$C9,$1F,$4B,$65,$97,$80,$53,$C0
    Data.b $00,$B0,$B8,$E5,$00,$6E,$EF,$68,$91,$D1,$E5,$D4,$B7,$B2,$D9,$6C
    Data.b $23,$18,$CC,$DA,$59,$6F,$30,$DE,$98,$0D,$BF,$58,$8F,$20,$D6,$C2
    Data.b $CB,$80,$08,$EF,$44,$43,$92,$62,$6E,$85,$7B,$BB,$B7,$F1,$17,$E7
    Data.b $E7,$4A,$FF,$3C,$35,$37,$0F,$BC,$03,$BC,$0C,$BC,$07,$14,$2F,$FE
    Data.b $E7,$2D,$00,$F0,$DC,$CF,$3F,$F0,$B9,$D4,$C2,$E2,$CF,$69,$63,$42
    Data.b $43,$0D,$18,$63,$CD,$5D,$F7,$C6,$C5,$EF,$34,$EF,$03,$D0,$4D,$B6
    Data.b $B0,$9C,$5A,$E4,$F6,$D6,$56,$4E,$94,$AB,$B5,$AF,$0D,$9D,$59,$02
    Data.b $4E,$00,$2F,$59,$0F,$64,$3F,$A8,$02,$61,$6B,$F4,$A6,$D7,$C0,$AF
    Data.b $7E,$AA,$A7,$3E,$33,$FF,$7C,$B1,$52,$89,$E9,$75,$E3,$2F,$24,$EE
    Data.b $7A,$F2,$1A,$61,$3D,$20,$2C,$B0,$8B,$81,$44,$92,$CD,$2C,$66,$D3
    Data.b $EC,$F0,$1C,$62,$8D,$8D,$C1,$27,$0F,$1F,$5D,$AE,$69,$3D,$08,$FC
    Data.b $27,$F0,$DF,$36,$74,$EA,$97,$B3,$65,$D3,$49,$BC,$2D,$1E,$95,$0D
    Data.b $CB,$A9,$3F,$9F,$CF,$64,$5B,$EB,$DA,$86,$87,$14,$08,$21,$C2,$E4
    Data.b $15,$62,$3D,$65,$8D,$08,$BD,$83,$30,$17,$9D,$BC,$30,$E0,$C5,$13
    Data.b $A4,$2A,$55,$9A,$B4,$4F,$7F,$4F,$AF,$B9,$FF,$D5,$37,$53,$85,$7A
    Data.b $7D,$14,$38,$04,$1C,$B1,$A5,$D3,$BF,$92,$3D,$9B,$06,$F0,$BD,$BB
    Data.b $6F,$DB,$51,$2A,$64,$9B,$DC,$98,$BB,$D4,$28,$44,$9B,$13,$68,$55
    Data.b $01,$7C,$24,$01,$10,$04,$9A,$7A,$50,$47,$23,$C2,$92,$23,$42,$4F
    Data.b $5C,$F4,$52,$2F,$42,$59,$45,$08,$52,$33,$7C,$64,$D7,$4E,$1E,$79
    Data.b $EB,$64,$F6,$5C,$A1,$34,$09,$FC,$D8,$EE,$F3,$B6,$F2,$DC,$90,$4E
    Data.b $DC,$00,$7C,$18,$F8,$B8,$14,$E2,$CE,$CE,$88,$D7,$D6,$1F,$75,$93
    Data.b $3B,$A3,$5E,$BC,$37,$EA,$C5,$BA,$63,$D1,$C8,$81,$F6,$D6,$86,$42
    Data.b $D5,$57,$75,$AD,$C1,$7A,$06,$04,$CA,$F5,$30,$DA,$40,$73,$27,$33
    Data.b $D3,$A3,$1C,$DC,$BE,$9D,$A7,$46,$27,$0B,$CF,$8E,$4D,$4E,$02,$AF
    Data.b $00,$CF,$DB,$F8,$CF,$7D,$50,$D2,$6E,$05,$00,$0F,$E8,$06,$3E,$64
    Data.b $AF,$4D,$76,$37,$02,$4D,$F7,$75,$B4,$DC,$FC,$F5,$5D,$7D,$3F,$5D
    Data.b $F1,$7D,$A9,$A5,$40,$08,$89,$10,$82,$68,$A2,$89,$B2,$72,$E9,$2E
    Data.b $67,$19,$CE,$64,$D8,$D7,$DE,$C1,$6B,$C5,$4A,$F9,$37,$8F,$0D,$CE
    Data.b $D8,$90,$79,$0E,$78,$13,$48,$5D,$2E,$69,$B7,$A2,$91,$F9,$C0,$1C
    Data.b $B0,$02,$44,$2C,$A0,$28,$10,$FB,$E8,$AE,$BE,$9D,$7F,$78,$53,$CF
    Data.b $F7,$D2,$B9,$9C,$34,$80,$D1,$06,$21,$34,$5E,$34,$46,$25,$92,$20
    Data.b $7D,$EE,$34,$BB,$3E,$B4,$C7,$FC,$D5,$E8,$54,$7E,$78,$7C,$2E,$B7
    Data.b $58,$A9,$AE,$00,$EF,$02,$2F,$DA,$7A,$9F,$DE,$8C,$F1,$D7,$0A,$C0
    Data.b $58,$10,$BE,$AD,$CF,$02,$E0,$B7,$EE,$DC,$1B,$FB,$62,$6F,$F7,$B3
    Data.b $53,$B3,$B3,$ED,$D2,$5A,$61,$0C,$08,$29,$50,$AD,$3D,$4C,$9F,$3D
    Data.b $C9,$DD,$BB,$76,$F3,$C4,$C0,$70,$EE,$D0,$D2,$EA,$14,$30,$04,$0C
    Data.b $5B,$00,$A7,$80,$A5,$0F,$6A,$56,$5B,$0A,$E0,$C4,$E7,$7F,$B1,$AF
    Data.b $AB,$BD,$E5,$EE,$B9,$7C,$31,$FF,$97,$C7,$4E,$9F,$FD,$F6,$D1,$A1
    Data.b $55,$A0,$FE,$1B,$7B,$76,$FE,$C9,$FC,$EC,$DC,$4F,$79,$9E,$8B,$D6
    Data.b $10,$18,$83,$36,$86,$78,$F7,$2E,$46,$CE,$BE,$CB,$BE,$BE,$3E,$7E
    Data.b $F7,$BD,$F1,$FC,$CB,$0B,$4B,$D3,$B6,$44,$FE,$97,$6D,$52,$CB,$96
    Data.b $E7,$F8,$D7,$52,$D2,$37,$95,$03,$23,$8F,$7C,$7C,$77,$9B,$E7,$9F
    Data.b $90,$E5,$5A,$A3,$17,$8B,$E2,$C6,$63,$A6,$8C,$9C,$AF,$69,$31,$5D
    Data.b $5C,$4E,$1D,$F0,$A5,$C0,$AF,$07,$54,$FD,$80,$7A,$60,$50,$89,$36
    Data.b $06,$C7,$DE,$A3,$29,$1E,$E5,$B9,$D5,$5C,$F1,$EF,$C7,$26,$D7,$8C
    Data.b $FF,$37,$DB,$69,$53,$F6,$D4,$CD,$B5,$36,$D4,$AB,$F6,$C0,$67,$77
    Data.b $F7,$39,$CD,$75,$FF,$AF,$4B,$42,$37,$CA,$B6,$26,$F2,$42,$11,$18
    Data.b $21,$02,$4D,$4F,$63,$26,$D7,$D3,$D8,$D5,$46,$60,$04,$D5,$9A,$4F
    Data.b $B9,$E2,$83,$8C,$71,$6C,$6C,$94,$93,$B3,$73,$2C,$B5,$75,$54,$FE
    Data.b $69,$6C,$72,$19,$38,$69,$3B,$EC,$80,$35,$BE,$7E,$BD,$64,$F2,$6A
    Data.b $01,$88,$A7,$EF,$D8,$F7,$EB,$C2,$D1,$0F,$44,$3D,$17,$53,$AD,$13
    Data.b $51,$06,$A9,$1C,$8C,$00,$A7,$B3,$05,$E5,$44,$08,$0C,$18,$E9,$10
    Data.b $C8,$18,$D3,$B9,$22,$AB,$E9,$15,$5A,$1C,$C5,$1D,$1E,$D1,$5F,$BE
    Data.b $7F,$7F,$B7,$1B,$8D,$DC,$E1,$41,$09,$6D,$92,$43,$99,$DC,$C9,$3F
    Data.b $38,$75,$76,$32,$5D,$F3,$2B,$36,$7C,$D6,$44,$8B,$D9,$F2,$10,$1A
    Data.b $FD,$D4,$47,$F7,$36,$4B,$73,$54,$C4,$9C,$B8,$11,$21,$9D,$14,$CA
    Data.b $41,$48,$85,$54,$0A,$A9,$1C,$84,$0A,$63,$BF,$EA,$07,$94,$CB,$3E
    Data.b $E5,$9A,$8F,$89,$46,$A9,$6B,$4D,$10,$F8,$54,$4A,$45,$74,$21,$4F
    Data.b $BC,$52,$A0,$39,$E2,$12,$73,$5C,$DC,$48,$24,$8F,$1B,$19,$79,$FC
    Data.b $E8,$D0,$D7,$BE,$3F,$39,$3B,$68,$2B,$5B,$75,$4B,$3D,$F0,$D4,$87
    Data.b $6F,$F6,$9A,$D1,$DF,$51,$31,$27,$AE,$37,$E2,$5E,$A3,$CE,$6B,$47
    Data.b $A6,$0D,$C6,$08,$04,$02,$29,$15,$AE,$32,$D4,$7D,$8D,$A7,$5C,$DC
    Data.b $68,$03,$AD,$8D,$9D,$18,$2F,$8A,$69,$68,$24,$9D,$5A,$62,$F0,$D8
    Data.b $6B,$EC,$4D,$36,$25,$FF,$71,$75,$31,$FA,$FD,$C9,$D9,$7B,$AC,$E1
    Data.b $45,$DB,$81,$AF,$DA,$0B,$57,$62,$A3,$E2,$0B,$3B,$7B,$9F,$54,$51
    Data.b $79,$E0,$82,$02,$17,$17,$5F,$4D,$C8,$8F,$D7,$08,$1D,$58,$5E,$24
    Data.b $25,$42,$48,$A4,$08,$29,$85,$90,$0A,$57,$3A,$88,$62,$85,$F1,$63
    Data.b $6F,$B0,$23,$12,$E7,$07,$D9,$42,$E9,$F7,$4F,$BD,$07,$D0,$62,$8D
    Data.b $DE,$DA,$32,$3A,$F1,$B1,$03,$B7,$47,$A4,$F9,$AA,$72,$54,$28,$0B
    Data.b $85,$C4,$08,$19,$1A,$27,$25,$88,$D0,$48,$83,$E4,$02,$7B,$5E,$23
    Data.b $76,$12,$69,$F9,$90,$10,$E1,$30,$A2,$5E,$0F,$38,$79,$FC,$75,$7A
    Data.b $84,$66,$C4,$50,$FB,$CA,$C0,$F0,$32,$70,$06,$78,$1B,$18,$03,$CA
    Data.b $9B,$CD,$81,$CB,$D2,$E9,$A9,$72,$35,$98,$C9,$E5,$53,$A3,$4B,$E9
    Data.b $F6,$7A,$D5,$4F,$B6,$2B,$E5,$4A,$C7,$11,$D2,$71,$2D,$08,$15,$4A
    Data.b $AB,$90,$86,$A2,$8D,$08,$35,$B1,$D6,$68,$0D,$46,$48,$A4,$08,$F3
    Data.b $04,$E9,$70,$7A,$78,$80,$58,$3E,$4D,$D0,$D8,$58,$7F,$E4,$C8,$F1
    Data.b $45,$5F,$9B,$41,$E0,$47,$96,$C0,$CD,$5F,$4B,$2F,$B8,$2C,$80,$91
    Data.b $7C,$49,$1D,$5A,$CD,$55,$7F,$B8,$94,$CE,$7F,$F7,$FC,$C2,$6A,$A6
    Data.b $5C,$F3,$1E,$EC,$ED,$EC,$10,$9E,$7B,$E1,$F4,$CD,$05,$FA,$AC,$4D
    Data.b $28,$EA,$03,$1D,$0A,$FB,$50,$43,$4A,$A4,$72,$18,$9B,$38,$4B,$7D
    Data.b $69,$86,$8E,$CE,$8E,$E0,$13,$87,$8F,$AD,$14,$EA,$C1,$69,$CB,$FB
    Data.b $5F,$05,$A6,$AE,$96,$7D,$6E,$56,$D0,$68,$9B,$58,$B3,$BF,$D4,$DB
    Data.b $59,$FD,$C6,$5D,$7B,$3F,$EB,$25,$E3,$6E,$28,$50,$04,$06,$C9,$F8
    Data.b $CC,$2A,$A5,$89,$31,$DC,$6A,$99,$A0,$1E,$A0,$09,$E3,$5D,$5B,$50
    Data.b $42,$2A,$66,$16,$E6,$C9,$4C,$8D,$D2,$DF,$DB,$AD,$1F,$3A,$32,$90
    Data.b $5A,$A8,$54,$CF,$5A,$FE,$F3,$12,$30,$B1,$D9,$CA,$B3,$99,$2A,$54
    Data.b $07,$52,$5F,$BD,$75,$47,$ED,$4B,$BB,$B7,$FF,$43,$A4,$B1,$21,$A6
    Data.b $B5,$59,$D7,$B3,$73,$A9,$02,$93,$13,$A3,$F4,$75,$B5,$E9,$4F,$1E
    Data.b $3E,$91,$E9,$95,$54,$EE,$6B,$49,$AA,$FD,$AD,$4D,$89,$BD,$6D,$6D
    Data.b $71,$95,$68,$12,$2B,$5A,$B1,$30,$31,$CC,$1D,$7D,$3D,$E6,$D3,$EF
    Data.b $0C,$66,$CE,$17,$CB,$13,$F6,$D4,$5F,$B1,$C6,$57,$AE,$A7,$13,$5F
    Data.b $B1,$0F,$C4,$1D,$47,$4C,$FC,$CC,$FE,$67,$22,$ED,$6D,$8F,$6B,$A5
    Data.b $C2,$E1,$88,$10,$64,$2A,$9A,$A3,$43,$C3,$F4,$B4,$35,$99,$C7,$4F
    Data.b $9D,$4D,$BD,$97,$2B,$4E,$02,$A7,$ED,$00,$AA,$B9,$41,$A9,$AE,$FB
    Data.b $1A,$63,$DD,$B7,$34,$44,$DB,$13,$5E,$34,$FA,$1F,$A9,$5C,$F9,$64
    Data.b $26,$37,$03,$BC,$06,$FC,$00,$18,$04,$F2,$D7,$63,$FC,$55,$01,$98
    Data.b $3E,$B8,$FF,$B1,$44,$6B,$EB,$DF,$E2,$45,$84,$16,$60,$90,$54,$EA
    Data.b $F0,$C6,$F0,$08,$6E,$D4,$31,$5F,$1F,$9F,$CD,$0C,$A4,$B2,$E7,$AC
    Data.b $14,$3C,$64,$75,$6C,$12,$E8,$B2,$7A,$A1,$07,$E8,$B4,$EF,$1A,$03
    Data.b $0E,$5B,$E3,$B3,$9B,$A5,$CE,$9B,$0E,$A1,$33,$0F,$DC,$FE,$13,$89
    Data.b $64,$F2,$5B,$78,$AE,$08,$45,$79,$58,$65,$06,$C6,$26,$79,$7D,$7A
    Data.b $86,$F9,$D6,$B6,$CA,$C9,$74,$6E,$09,$38,$6A,$E3,$F9,$B8,$55,$53
    Data.b $CA,$6A,$84,$04,$D0,$6C,$05,$8F,$B4,$9D,$76,$CE,$9E,$FC,$75,$1B
    Data.b $7F,$D9,$24,$FE,$D7,$7B,$F6,$C5,$F7,$35,$35,$FE,$48,$26,$13,$3B
    Data.b $40,$AC,$CF,$73,$16,$6B,$01,$E7,$4B,$45,$2A,$F9,$02,$F7,$B4,$35
    Data.b $B9,$BF,$F7,$B3,$F7,$24,$1F,$DE,$DD,$A7,$3E,$D6,$D7,$99,$2E,$F9
    Data.b $C1,$F4,$78,$AE,$50,$B5,$B9,$53,$B1,$86,$AE,$02,$0B,$C0,$AC,$05
    Data.b $50,$B9,$DE,$B0,$B9,$62,$08,$25,$5C,$47,$4C,$1E,$BC,$EB,$59,$AF
    Data.b $B9,$E9,$0B,$5A,$CA,$0B,$E3,$12,$11,$56,$1F,$5F,$2A,$2A,$91,$08
    Data.b $99,$5C,$91,$F4,$EA,$2A,$D1,$5A,$95,$AE,$64,$03,$1D,$AD,$CD,$7E
    Data.b $C5,$98,$E3,$73,$85,$D2,$AB,$87,$E6,$96,$5F,$FC,$CA,$B1,$D3,$43
    Data.b $DA,$98,$D2,$86,$D1,$E0,$96,$19,$7E,$59,$00,$0B,$0F,$FE,$E4,$AF
    Data.b $24,$9B,$9B,$FE,$C6,$B8,$EE,$FA,$7C,$DB,$AC,$F9,$5C,$4A,$90,$2A
    Data.b $6C,$62,$42,$51,$AD,$6B,$2A,$8E,$4B,$BE,$54,$A2,$98,$CF,$E2,$94
    Data.b $8B,$B4,$7A,$2E,$2D,$89,$38,$28,$35,$BD,$5A,$2E,$BF,$7E,$26,$5B
    Data.b $78,$F9,$A9,$E1,$89,$1F,$BF,$B5,$9A,$5B,$B5,$1E,$A8,$6F,$55,$08
    Data.b $FD,$2F,$00,$E3,$07,$F7,$DF,$B6,$AD,$31,$F9,$86,$88,$46,$13,$21
    Data.b $CD,$11,$04,$98,$90,$2A,$0B,$81,$11,$21,$85,$40,$28,$8C,$0C,$AF
    Data.b $DA,$F6,$84,$5A,$3D,$C0,$F7,$5C,$8A,$7E,$8D,$4A,$B9,$08,$99,$14
    Data.b $4D,$D4,$69,$F2,$3C,$12,$B1,$48,$39,$5B,$AD,$BD,$3D,$57,$AA,$1C
    Data.b $7A,$7E,$6E,$E5,$C5,$3F,$1A,$99,$1A,$03,$D6,$BC,$A3,$AF,$D5,$3B
    Data.b $17,$01,$F8,$E6,$81,$7D,$D1,$CF,$B5,$37,$1D,$93,$89,$86,$7D,$C8
    Data.b $90,$BF,$84,$5F,$17,$2C,$00,$42,$00,$6B,$7B,$1D,$C8,$DA,$33,$04
    Data.b $DA,$EE,$40,$1B,$EA,$91,$18,$65,$61,$A8,$96,$F3,$04,$E9,$25,$12
    Data.b $A5,$3C,$CD,$8E,$43,$5B,$3C,$66,$AA,$5A,$8F,$2F,$55,$FD,$57,$07
    Data.b $73,$C5,$97,$7F,$67,$68,$FC,$8D,$B1,$42,$39,$6B,$BD,$13,$6C,$C6
    Data.b $3B,$97,$7A,$C0,$FB,$F2,$EE,$EE,$83,$77,$B5,$34,$3E,$79,$4F,$47
    Data.b $CB,$81,$6D,$89,$86,$98,$56,$2A,$F4,$F7,$06,$00,$7A,$23,$00,$29
    Data.b $31,$22,$FC,$8A,$A4,$C5,$5A,$87,$16,$68,$2C,$C9,$13,$12,$23,$25
    Data.b $81,$EB,$51,$F3,$5C,$CA,$A5,$0C,$F5,$EC,$32,$B1,$CC,$0A,$ED,$AE
    Data.b $43,$B3,$EB,$A1,$94,$93,$5B,$AD,$D5,$DF,$38,$5F,$AE,$BE,$F2,$77
    Data.b $53,$F3,$2F,$3D,$33,$3E,$7D,$DE,$32,$80,$FA,$95,$3C,$73,$69,$15
    Data.b $92,$6F,$A5,$0B,$FA,$B9,$F9,$D5,$EC,$37,$C7,$67,$B3,$43,$A9,$B4
    Data.b $1F,$0D,$02,$AF,$2F,$E2,$C5,$94,$72,$C2,$09,$95,$10,$F6,$1F,$C5
    Data.b $DA,$C4,$7F,$C3,$1B,$C4,$C6,$2F,$01,$17,$EE,$85,$44,$21,$88,$18
    Data.b $49,$C2,$4D,$10,$4D,$76,$22,$FA,$F6,$90,$8E,$27,$59,$74,$24,$2B
    Data.b $D9,$74,$24,$22,$D8,$B3,$3B,$16,$79,$70,$B4,$54,$6E,$7F,$69,$31
    Data.b $35,$67,$85,$7E,$79,$B3,$00,$B0,$BC,$64,$D9,$C0,$F9,$91,$42,$E5
    Data.b $DC,$BF,$CC,$AD,$4C,$7F,$67,$72,$6E,$39,$5D,$28,$D0,$2A,$45,$B4
    Data.b $D3,$73,$23,$46,$3A,$E1,$0C,$D4,$88,$F5,$CA,$64,$6C,$9D,$DD,$08
    Data.b $CE,$58,$70,$42,$08,$1B,$6E,$E1,$90,$4B,$4A,$85,$AB,$05,$0D,$5E
    Data.b $12,$65,$A2,$2C,$A4,$57,$91,$F9,$A2,$F9,$ED,$33,$13,$0B,$7F,$3A
    Data.b $3A,$BD,$68,$BB,$F9,$F4,$D5,$34,$3B,$F5,$3E,$33,$9F,$9A,$6D,$46
    Data.b $8B,$76,$46,$39,$5E,$0E,$F4,$B9,$B7,$33,$85,$73,$DF,$9D,$5A,$98
    Data.b $79,$61,$6E,$29,$67,$AA,$65,$D5,$E7,$AA,$78,$C2,$71,$94,$91,$CE
    Data.b $45,$A7,$7D,$61,$42,$BD,$E6,$A1,$B5,$9F,$2D,$ED,$DE,$00,$AC,$5A
    Data.b $2C,$30,$F9,$EE,$11,$3A,$74,$D5,$3C,$39,$36,$95,$FB,$F7,$B9,$95
    Data.b $05,$3B,$2B,$3A,$6A,$79,$52,$E9,$4A,$1E,$10,$57,$91,$23,$8E,$ED
    Data.b $AA,$2D,$96,$1A,$EC,$04,$FA,$A5,$10,$FD,$0F,$75,$35,$DF,$FA,$E9
    Data.b $9E,$AE,$5D,$F7,$76,$77,$B5,$39,$B1,$A4,$34,$8E,$67,$3D,$22,$D1
    Data.b $A8,$F5,$9C,$40,$2A,$BB,$43,$1D,$2D,$94,$43,$B9,$54,$60,$E6,$CC
    Data.b $00,$ED,$51,$C7,$3C,$71,$7A,$3C,$F3,$56,$2A,$37,$65,$47,$2E,$2F
    Data.b $00,$C7,$6C,$D3,$AB,$5F,$37,$17,$BA,$44,$7E,$BA,$76,$B8,$DB,$06
    Data.b $F4,$01,$BB,$81,$9B,$5B,$3D,$A7,$FF,$B1,$9E,$F6,$5B,$1E,$EA,$ED
    Data.b $DE,$BE,$B7,$BD,$3D,$59,$8F,$24,$D1,$D2,$59,$4F,$FA,$30,$D9,$D5
    Data.b $FA,$2E,$15,$73,$2C,$4C,$0C,$D3,$1C,$73,$F5,$E7,$07,$47,$D3,$43
    Data.b $21,$11,$3C,$6C,$F5,$C1,$89,$0D,$F3,$A2,$1B,$32,$DC,$15,$16,$4C
    Data.b $C4,$92,$B6,$4E,$E0,$26,$A0,$1F,$E8,$BF,$AD,$31,$7E,$CB,$67,$7A
    Data.b $3B,$F6,$3C,$D8,$DB,$D3,$DD,$92,$68,$F1,$EA,$91,$44,$28,$29,$A5
    Data.b $83,$91,$92,$42,$3E,$C3,$EA,$F4,$28,$B1,$58,$24,$F8,$CC,$C9,$91
    Data.b $D4,$B9,$62,$65,$C2,$7E,$85,$7C,$C1,$92,$BC,$CC,$66,$B4,$B1,$D8
    Data.b $82,$46,$B8,$31,$C4,$B6,$01,$BB,$80,$7E,$25,$44,$FF,$27,$BA,$9A
    Data.b $6F,$7D,$B8,$BB,$63,$D7,$47,$B6,$F5,$B4,$89,$78,$8B,$CC,$96,$4B
    Data.b $64,$17,$A6,$20,$E2,$06,$8F,$9E,$18,$59,$59,$A8,$D4,$C6,$AC,$36
    Data.b $78,$D1,$CE,$4A,$37,$CD,$50,$C5,$16,$D2,$92,$0F,$0C,$B1,$36,$CF
    Data.b $E9,$7F,$AC,$B7,$FD,$D6,$7D,$D1,$58,$EF,$8A,$31,$3C,$3D,$3E,$93
    Data.b $CD,$FA,$F5,$35,$E3,$5F,$B2,$33,$D2,$6B,$62,$A8,$82,$1B,$B3,$D4
    Data.b $25,$21,$B6,$03,$D8,$63,$C3,$AC,$CB,$36,$A9,$E3,$36,$69,$47,$6D
    Data.b $CD,$37,$5B,$C2,$85,$6E,$00,$59,$74,$80,$98,$D5,$05,$DB,$AC,$77
    Data.b $2A,$56,$C8,$CF,$5F,$CB,$28,$E5,$FF,$12,$C0,$A5,$21,$E6,$D8,$30
    Data.b $33,$37,$92,$62,$FF,$BF,$5A,$FF,$03,$14,$40,$F3,$DA,$D8,$5F,$19
    Data.b $B7,$00,$00,$00,$00,$49,$45,$4E,$44,$AE,$42,$60,$82
EndDataSection 

CompilerEndIf

weil einfach einfach einfach ist ... mach' ich es anders
C h r i s :)
Beiträge: 56
Registriert: 12.11.2015 17:41

Re: [Modul] Logitech Gxxx (LCD) [WIN]

Beitrag von C h r i s :) »

coole sache das :allright: :allright: :allright:
kannst du auch ein code für die dell laptop tastaturbeleuchtung schreiben :?: :)
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: [Modul] Logitech Gxxx (LCD) [WIN]

Beitrag von Bisonte »

Interessant.

Da hatte ich in HeX0r's G15-G19 Thread auch schon einmal soetwas in der Richtung vorgestellt :
http://purebasic.fr/german/viewtopic.ph ... 76#p318676

Läuft beides ;)
Wobei in deiner Demo die CPU Last (wegen eines fehlenden Fensters mit Eventverarbeitung)
doch gegen 100% geht...
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: [Modul] Logitech Gxxx (LCD) [WIN]

Beitrag von Imhotheb »

Moin,

ähhhhm ... was soll ich da sagen ... wegen des nicht mehr funktionierenden ersten post von hexor habe ich überhaupt erst versucht das ganze neu umzusetzen ... hätte ich mal weitergelesen ^^

wegen der Cpu-Last ... hatte erst ein delay(10) mit drin, was die Last dann doch um einiges gedrückt hat ... so läuft es halt "ungebremst" durch ... aber ist ja nur eine demo

allerdings muss ich zugeben, das ich deine Routine zum erzeugen der Pixmap wesentlich eleganter finde

aber grundsätzlich ist es nur ein Gerüst und wird noch erweitert ;)
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: [Modul] Logitech Gxxx (LCD) [WIN]

Beitrag von Sicro »

Code wird zum CodeArchiv unter Multimedia/Keyboard/ControllingKeyboardLCDs.pbi hinzugefügt.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten