1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. eukalyptus

Beiträge von eukalyptus

  • SoundPlay Ausgabegerät wählen

    • eukalyptus
    • 4. Februar 2016 um 19:25

    Mit DirectSound geht das auch ohne externe DLL:

    AutoIt
    #include "DirectSound.au3"
    #include <Array.au3>
    
    
    
    
    
    
    Global $aDevice = _DSnd_Enumerate()
    _ArrayDisplay($aDevice)
    
    
    
    
    Global $aSND1 = _SND_Play("Test.wav", 2)
    Global $aSND2 = _SND_Play("Test.mp3", 3)
    
    
    
    
    While _SND_IsPlaying($aSND1) Or _SND_IsPlaying($aSND2)
    	ToolTip("Sound1:  " & StringFormat("%.1f", _SND_GetPosition($aSND1) * 100) & "%" & @CRLF & "Sound2:  " & StringFormat("%.1f", _SND_GetPosition($aSND2) * 100) & "%")
    	Sleep(100)
    WEnd
    
    
    _SND_Stop($aSND1)
    _SND_Stop($aSND2)
    
    
    
    
    
    
    
    
    
    
    
    
    Func _SND_Play($sFile, $iDevice = 1, $fVolume = 1)
    	Local $aWav = _DSnd_WaveLoadFromFile($sFile)
    	If @error Then
    		Local $hFile = FileOpen($sFile, 16)
    		Local $bFile = FileRead($sFile)
    		FileClose($hFile)
    		$aWav = _DSnd_MP3Decode($bFile)
    	EndIf
    
    
    	If Not IsArray($aWav) Then Return SetError(1, 0, False)
    
    
    	Switch $aWav[1].FormatTag
    		Case $WAVE_FORMAT_MPEG, $WAVE_FORMAT_MPEGLAYER3
    			$aWav = _DSnd_MP3Decode($aWav[0])
    			If @error Then Return SetError(1, 1, False)
    	EndSwitch
    
    
    	Local $aDevice = _DSnd_Enumerate()
    	If @error Or Not IsArray($aDevice) Then Return SetError(1, 2, False)
    	If $iDevice < 1 Then
    		$iDevice = 1
    	ElseIf $iDevice > $aDevice[0][0] Then
    		$iDevice = $aDevice[0][0]
    	EndIf
    
    
    	Local $aSND[3]
    	$aSND[0] = _DSnd_Create($aDevice[$iDevice][2])
    	$aSND[1] = _DSnd_CreateSoundBuffer($aSND[0], BitOR($DSBCAPS_GLOBALFOCUS, $DSBCAPS_CTRLVOLUME), BinaryLen($aWav[0]), $aWav[1].Channels, $aWav[1].SamplesPerSec, $aWav[1].BitsPerSample, $aWav[1].FormatTag)
    	$aSND[2] = BinaryLen($aWav[0])
    
    
    	Local $aLock = _DSnd_BufferLock($aSND[1])
    	Local $tBuffer = DllStructCreate("byte[" & $aLock[1] & "];", $aLock[0])
    	DllStructSetData($tBuffer, 1, $aWav[0])
    	_DSnd_BufferUnLock($aSND[1], $aLock)
    
    
    	_SND_SetVolume($aSND, $fVolume)
    	_DSnd_BufferPlay($aSND[1])
    
    
    	Return $aSND
    EndFunc   ;==>_SND_Play
    
    
    
    
    Func _SND_Stop(ByRef $aSND)
    	If Not IsArray($aSND) Or UBound($aSND) <> 3 Then Return SetError(1, 0, False)
    	$aSND[1].Stop()
    	$aSND[1] = 0
    	$aSND[0] = 0
    	$aSND = 0
    EndFunc   ;==>_SND_Stop
    
    
    
    
    Func _SND_SetVolume($aSND, $fVolume)
    	If Not IsArray($aSND) Or UBound($aSND) <> 3 Then Return SetError(1, 0, False)
    
    
    	If $fVolume < 0.00001 Then
    		$fVolume = 0.00001
    	ElseIf $fVolume > 1 Then
    		$fVolume = 1
    	EndIf
    
    
    	Local $fDB = 20 * Log($fVolume) / Log(10)
    	$aSND[1].SetVolume($fDB * 100)
    EndFunc   ;==>_SND_SetVolume
    
    
    
    
    Func _SND_IsPlaying($aSND)
    	If Not IsArray($aSND) Or UBound($aSND) <> 3 Then Return SetError(1, 0, False)
    	Local $iStatus
    	$aSND[1].GetStatus($iStatus)
    	Return BitAND($iStatus, $DSBSTATUS_PLAYING)
    EndFunc   ;==>_SND_IsPlaying
    
    
    
    
    Func _SND_GetPosition($aSND)
    	If Not IsArray($aSND) Or UBound($aSND) <> 3 Then Return SetError(1, 0, False)
    	Local $iPos
    	$aSND[1].GetCurrentPosition($iPos, Null)
    	Return $iPos / $aSND[2]
    EndFunc   ;==>_SND_GetPosition
    Alles anzeigen

    Die benötigte DirectSound-UDF findest du in meinem Anhang

  • Some Graphical Examples using GDI+ Vol. II build 2016-05-07

    • eukalyptus
    • 26. Januar 2016 um 20:28

    DAS ist ja wieder mal so unsagbar geil, dass es einem glatt die Sprache verschlägt :thumbup:

  • [GDI+] Asteroiden Generator

    • eukalyptus
    • 18. Januar 2016 um 00:22

    Vielleicht kannst du ja das brauchen.
    Dieses Script erstellt eine Kugel mit einer zufälligen Gleichverteilung:

    AutoIt
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include "Matrix.au3"
    
    
    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)
    
    
    
    
    Global $iWidth = 600
    Global $iHeight = 600
    
    
    
    
    
    
    Global Const $cPI = ATan(1) * 4
    
    
    _GDIPlus_Startup()
    Global $hGui_Main = GUICreate("", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    
    
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui_Main)
    Global $hBmp_Buffer = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
    Global $hGfx_Buffer = _GDIPlus_ImageGetGraphicsContext($hBmp_Buffer)
    _GDIPlus_GraphicsClear($hGfx_Buffer, 0xFF000000)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx_Buffer, 2)
    
    
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState()
    
    
    
    
    
    
    
    
    Global $tOBJ = _Create()
    Global $tMX = _MX3D_Create()
    
    
    
    
    While Sleep(10)
    	_Test()
    WEnd
    
    
    
    
    
    
    Func _Create()
    	Local $iCnt = 500
    	Local $tPnt = DllStructCreate("uint Cnt; float Pnt[" & $iCnt * 2 & "]; byte Vis[" & $iCnt & "]; float 3D[" & $iCnt * 3 & "];")
    	DllStructSetData($tPnt, "Cnt", $iCnt)
    
    
    	Local $fPhi, $fTheta, $fVX, $fVY, $fVZ, $fD, $fX, $fY
    
    
    	Local $iIdx = 0
    	For $i = 0 To $iCnt - 1
    		$fPhi = ACos(Random(-1, 1))
    		$fTheta = Random(0, $cPI * 2)
    
    
    		$fVX = Sin($fPhi) * Cos($fTheta) * 160; * $fSpeed
    		$fVZ = Sin($fPhi) * Sin($fTheta) * 160; * $fSpeed
    		$fVY = Cos($fPhi) * 160; * $fSpeed
    
    
    
    
    		DllStructSetData($tPnt, "3D", $fVX, $i * 3 + 1)
    		DllStructSetData($tPnt, "3D", $fVY, $i * 3 + 2)
    		DllStructSetData($tPnt, "3D", $fVZ, $i * 3 + 3)
    
    
    
    
    	Next
    
    
    	Return $tPnt
    EndFunc   ;==>_Create
    
    
    
    
    
    
    
    
    Func _Test()
    	Local Static $iStep = 0
    	$iStep += 1
    
    
    
    
    
    
    	Local $fSpeed = $iStep
    
    
    	Local $hPen = _GDIPlus_PenCreate(0xFF00FF00)
    
    
    	_MX3D_RotateX($tMX, 0.7)
    	_MX3D_RotateY($tMX, 0.5)
    	_MX3D_RotateZ($tMX, 0.2)
    
    
    	TransFormPoints($tOBJ, $tMX)
    	_GDIPlus_GraphicsClear($hGfx_Buffer, 0xFF000000)
    
    
    	For $i = 0 To $tOBJ.Cnt - 1
    		_GDIPlus_GraphicsDrawEllipse($hGfx_Buffer, DllStructGetData($tOBJ, "Pnt", $i * 2 + 1), DllStructGetData($tOBJ, "Pnt", $i * 2 + 2), 4, 4, $hPen)
    	Next
    
    
    	_GDIPlus_PenDispose($hPen)
    
    
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBmp_Buffer, 0, 0)
    EndFunc   ;==>_Test
    
    
    
    
    
    
    
    
    
    
    
    
    Func TransFormPoints($tPnt, $tMX)
    	Local $iCnt = DllStructGetData($tPnt, "Cnt")
    	Local $fX, $fY, $fZ, $fRX, $fRY, $fRZ, $fD
    	Local $iIdx
    	Local Const $LENS = 800
    
    
    	Local $fCenterX = $iWidth * 0.5
    	Local $fCenterY = $iHeight * 0.5
    
    
    	For $i = 0 To $iCnt - 1
    		$iIdx = $i * 3
    		$fX = DllStructGetData($tPnt, "3D", $iIdx + 1)
    		$fY = DllStructGetData($tPnt, "3D", $iIdx + 2)
    		$fZ = DllStructGetData($tPnt, "3D", $iIdx + 3)
    
    
    		_MX3D_MulVector($tMX, $fX, $fY, $fZ, $fRX, $fRY, $fRZ)
    
    
    		$fD = ($LENS - $fRZ)
    		If $fD > 0 Then
    			$iIdx = $i * 2
    			DllStructSetData($tPnt, "Pnt", $fCenterX + ($LENS * $fRX / $fD), $iIdx + 1)
    			DllStructSetData($tPnt, "Pnt", $fCenterY - ($LENS * $fRY / $fD), $iIdx + 2)
    			DllStructSetData($tPnt, "Vis", True, $i + 1)
    		Else
    			DllStructSetData($tPnt, "Vis", False, $i + 1)
    		EndIf
    	Next
    
    
    EndFunc   ;==>TransFormPoints
    
    
    
    
    
    
    
    
    
    
    
    
    Func WM_PAINT($hWnd, $iMsg, $wParam, $lParam)
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBmp_Buffer, 0, 0)
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_PAINT
    
    
    
    
    
    
    Func _Exit()
    
    
    	_GDIPlus_GraphicsDispose($hGfx_Buffer)
    	_GDIPlus_BitmapDispose($hBmp_Buffer)
    	_GDIPlus_GraphicsDispose($hGraphics)
    	GUIDelete($hGui_Main)
    
    
    	_GDIPlus_Shutdown()
    	Exit
    EndFunc   ;==>_Exit
    Alles anzeigen

    Hier noch die "Matrix.au3"

    AutoIt
    #include-once
    
    
    Global Const $bMX2D_Init = "0x000000000000F03F000000000000000000000000000000000000000000000000000000000000F03F000000000000000000000000000000000000000000000000000000000000F03F"
    Global Const $bMX3D_Init = "0x000000000000F03F0000000000000000000000000000000000000000000000000000000000000000000000000000F03F0000000000000000000000000000000000000000000000000000000000000000000000000000F03F0000000000000000000000000000000000000000000000000000000000000000000000000000F03F"
    
    
    
    
    ; # Matrix 2D # =================================================================================================================
    
    
    Func _MX2D_Create()
    	;[ 1 0 0 ]
    	;[ 0 1 0 ]
    	;[ 0 0 1 ]
    	Local $tMX = DllStructCreate("double[9];")
    
    
    	DllStructSetData($tMX, 1, 1, 1)
    	DllStructSetData($tMX, 1, 1, 5)
    	DllStructSetData($tMX, 1, 1, 9)
    
    
    	Return $tMX
    EndFunc   ;==>_MX2D_Create
    
    
    
    
    Func _MX2D_Clear(ByRef $tMX)
    	$tMX = 0
    	$tMX = DllStructCreate("double[9];")
    EndFunc   ;==>_MX2D_Clear
    
    
    
    
    Func _MX2D_Reset(ByRef $tMX)
    	;[ 1 0 0 ]
    	;[ 0 1 0 ]
    	;[ 0 0 1 ]
    	Local $tSet = DllStructCreate("byte[72];", DllStructGetPtr($tMX))
    	DllStructSetData($tSet, 1, $bMX2D_Init)
    EndFunc   ;==>_MX2D_Reset
    
    
    
    
    Func _MX2D_GetValue($tMX, $iX, $iY)
    	Local $fRet = DllStructGetData($tMX, 1, $iX * 3 + $iY + 1)
    	If @error Then Return SetError(1, 1, False)
    	Return $fRet
    EndFunc   ;==>_MX2D_GetValue
    
    
    
    
    Func _MX2D_Rotate(ByRef $tMX, $fD, $iO = False)
    	;[ C  S  0 ]
    	;[-S  C  0 ]
    	;[ 0  0  1 ]
    
    
    	If $fD = 0 Then Return True
    	Local $fR = $fD * 0.0174532925199433
    
    
    	Local $fC = Cos($fR)
    	Local $fS = Sin($fR)
    
    
    	Local $tMX1 = _MX2D_Create()
    	DllStructSetData($tMX1, 1, $fC, 1)
    	DllStructSetData($tMX1, 1, $fS, 2)
    	DllStructSetData($tMX1, 1, -$fS, 4)
    	DllStructSetData($tMX1, 1, $fC, 5)
    
    
    	Switch $iO
    		Case False
    			$tMX = _MX2D_Mul($tMX1, $tMX)
    		Case Else
    			$tMX = _MX2D_Mul($tMX, $tMX1)
    	EndSwitch
    
    
    EndFunc   ;==>_MX2D_Rotate
    
    
    
    
    Func _MX2D_Scale(ByRef $tMX, $fSX, $fSY, $iO = False)
    	;[ X  0  0 ]
    	;[ 0  Y  0 ]
    	;[ 0  0  1 ]
    
    
    	Local $tMX1 = _MX2D_Create()
    	DllStructSetData($tMX1, 1, $fSX, 1)
    	DllStructSetData($tMX1, 1, $fSY, 5)
    
    
    	Switch $iO
    		Case False
    			$tMX = _MX2D_Mul($tMX1, $tMX)
    		Case Else
    			$tMX = _MX2D_Mul($tMX, $tMX1)
    	EndSwitch
    
    
    EndFunc   ;==>_MX2D_Scale
    
    
    
    
    Func _MX2D_Translate(ByRef $tMX, $fX, $fY, $iO = False)
    	;[ 1  0  0 ]
    	;[ 0  1  0 ]
    	;[ X  Y  1 ]
    
    
    	Local $tMX1 = _MX2D_Create()
    	DllStructSetData($tMX1, 1, $fX, 7)
    	DllStructSetData($tMX1, 1, $fY, 8)
    
    
    	Switch $iO
    		Case False
    			$tMX = _MX2D_Mul($tMX1, $tMX)
    		Case Else
    			$tMX = _MX2D_Mul($tMX, $tMX1)
    	EndSwitch
    
    
    EndFunc   ;==>_MX2D_Translate
    
    
    
    
    Func _MX2D_Mul($tMX1, $tMX2)
    	Local $tMX = DllStructCreate("double[9];")
    	Local $fS
    
    
    	For $x = 0 To 2
    		For $y = 0 To 2
    			$fS = 0
    			For $z = 0 To 2
    				$fS += DllStructGetData($tMX1, 1, $x * 3 + $z + 1) * DllStructGetData($tMX2, 1, $z * 3 + $y + 1)
    			Next
    			DllStructSetData($tMX, 1, $fS, $x * 3 + $y + 1)
    		Next
    	Next
    
    
    	Return $tMX
    EndFunc   ;==>_MX2D_Mul
    
    
    
    
    Func _MX2D_MulVector($tMX, $fX, $fY, ByRef $fRX, ByRef $fRY)
    	$fRX = ($fX * DllStructGetData($tMX, 1, 1)) + ($fY * DllStructGetData($tMX, 1, 2)) + DllStructGetData($tMX, 1, 3)
    	$fRY = ($fX * DllStructGetData($tMX, 1, 4)) + ($fY * DllStructGetData($tMX, 1, 5)) + DllStructGetData($tMX, 1, 6)
    	Return True
    EndFunc   ;==>_MX2D_MulVector
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ; # Matrix 3D # =================================================================================================================
    
    
    Func _MX3D_Create()
    	;[ 1  0  0  0 ]
    	;[ 0  1  0  0 ]
    	;[ 0  0  1  0 ]
    	;[ 0  0  0  1 ]
    	Local $tMX = DllStructCreate("double[16];")
    
    
    	DllStructSetData($tMX, 1, 1, 1)
    	DllStructSetData($tMX, 1, 1, 6)
    	DllStructSetData($tMX, 1, 1, 11)
    	DllStructSetData($tMX, 1, 1, 16)
    
    
    	Return $tMX
    EndFunc   ;==>_MX3D_Create
    
    
    
    
    Func _MX3D_Clear(ByRef $tMX)
    	$tMX = 0
    	$tMX = DllStructCreate("double[16];")
    EndFunc   ;==>_MX3D_Clear
    
    
    
    
    Func _MX3D_Reset(ByRef $tMX)
    	;[ 1  0  0  0 ]
    	;[ 0  1  0  0 ]
    	;[ 0  0  1  0 ]
    	;[ 0  0  0  1 ]
    	Local $tSet = DllStructCreate("byte[128];", DllStructGetPtr($tMX))
    	DllStructSetData($tSet, 1, $bMX3D_Init)
    EndFunc   ;==>_MX3D_Reset
    
    
    
    
    Func _MX3D_GetValue($tMX, $iX, $iY)
    	Local $fRet = DllStructGetData($tMX, 1, $iX * 4 + $iY + 1)
    	If @error Then Return SetError(1, 1, False)
    	Return $fRet
    EndFunc   ;==>_MX3D_GetValue
    
    
    
    
    
    
    
    
    Func _MX3D_Skew(ByRef $tMX, $fSkewX, $fSkewY, $iO = False)
    	;[ 1 SY  0 ]
    	;[SX  1  0 ]
    	;[ 0  0  1 ]
    
    
    	$fSkewX *= 0.0174532925199433
    	$fSkewY *= 0.0174532925199433
    
    
    	Local $tMX1 = _MX2D_Create()
    	DllStructSetData($tMX1, 1, Tan($fSkewY), 2)
    	DllStructSetData($tMX1, 1, Tan($fSkewX), 4)
    
    
    	Switch $iO
    		Case False
    			$tMX = _MX2D_Mul($tMX1, $tMX)
    		Case Else
    			$tMX = _MX2D_Mul($tMX, $tMX1)
    	EndSwitch
    
    
    EndFunc
    
    
    
    
    
    
    
    
    Func _MX3D_RotateX(ByRef $tMX, $fD, $iO = False)
    	;[ 1  0  0  0 ]
    	;[ 0  C -S  0 ]
    	;[ 0  S  C  0 ]
    	;[ 0  0  0  1 ]
    
    
    	If $fD = 0 Then Return
    	Local $fR = $fD * 0.0174532925199433
    
    
    	Local $fC = Cos($fR)
    	Local $fS = Sin($fR)
    
    
    	Local $tMX1 = _MX3D_Create()
    	DllStructSetData($tMX1, 1, $fC, 6)
    	DllStructSetData($tMX1, 1, -$fS, 7)
    	DllStructSetData($tMX1, 1, $fS, 10)
    	DllStructSetData($tMX1, 1, $fC, 11)
    
    
    	Switch $iO
    		Case False
    			$tMX = _MX3D_MulMatrix($tMX1, $tMX)
    		Case Else
    			$tMX = _MX3D_MulMatrix($tMX, $tMX1)
    	EndSwitch
    
    
    EndFunc   ;==>_MX3D_RotateX
    
    
    
    
    Func _MX3D_RotateY(ByRef $tMX, $fD, $iO = False)
    	;[ C  0  S  0 ]
    	;[ 0  1  0  0 ]
    	;[-S  0  C  0 ]
    	;[ 0  0  0  1 ]
    
    
    	If $fD = 0 Then Return
    	Local $fR = $fD * 0.0174532925199433
    
    
    	Local $fC = Cos($fR)
    	Local $fS = Sin($fR)
    
    
    	Local $tMX1 = _MX3D_Create()
    	DllStructSetData($tMX1, 1, $fC, 1)
    	DllStructSetData($tMX1, 1, $fS, 3)
    	DllStructSetData($tMX1, 1, -$fS, 9)
    	DllStructSetData($tMX1, 1, $fC, 11)
    
    
    	Switch $iO
    		Case False
    			$tMX = _MX3D_MulMatrix($tMX1, $tMX)
    		Case Else
    			$tMX = _MX3D_MulMatrix($tMX, $tMX1)
    	EndSwitch
    
    
    EndFunc   ;==>_MX3D_RotateY
    
    
    
    
    Func _MX3D_RotateZ(ByRef $tMX, $fD, $iO = False)
    	;[ C -S  0  0 ]
    	;[ S  C  0  0 ]
    	;[ 0  0  1  0 ]
    	;[ 0  0  0  1 ]
    
    
    	If $fD = 0 Then Return
    	Local $fR = $fD * 0.0174532925199433
    
    
    	Local $fC = Cos($fR)
    	Local $fS = Sin($fR)
    
    
    	Local $tMX1 = _MX3D_Create()
    	DllStructSetData($tMX1, 1, $fC, 1)
    	DllStructSetData($tMX1, 1, -$fS, 2)
    	DllStructSetData($tMX1, 1, $fS, 5)
    	DllStructSetData($tMX1, 1, $fC, 6)
    
    
    	Switch $iO
    		Case False
    			$tMX = _MX3D_MulMatrix($tMX1, $tMX)
    		Case Else
    			$tMX = _MX3D_MulMatrix($tMX, $tMX1)
    	EndSwitch
    
    
    EndFunc   ;==>_MX3D_RotateZ
    
    
    
    
    Func _MX3D_Scale(ByRef $tMX, $fX, $fY, $fZ, $iO = False)
    	;[ X  0  0  0 ]
    	;[ 0  Y  0  0 ]
    	;[ 0  0  Z  0 ]
    	;[ 0  0  0  1 ]
    
    
    	Local $tMX1 = _MX3D_Create()
    	DllStructSetData($tMX1, 1, $fX, 1)
    	DllStructSetData($tMX1, 1, $fY, 6)
    	DllStructSetData($tMX1, 1, $fZ, 11)
    
    
    	Switch $iO
    		Case False
    			$tMX = _MX3D_MulMatrix($tMX1, $tMX)
    		Case Else
    			$tMX = _MX3D_MulMatrix($tMX, $tMX1)
    	EndSwitch
    
    
    EndFunc   ;==>_MX3D_Scale
    
    
    
    
    Func _MX3D_Translate(ByRef $tMX, $fX, $fY, $fZ, $iO = False)
    	;[ 1  0  0  X ]
    	;[ 0  1  0  Y ]
    	;[ 0  0  1  Z ]
    	;[ 0  0  0  1 ]
    	Local $tMX1 = _MX3D_Create()
    	DllStructSetData($tMX1, 1, $fX, 4)
    	DllStructSetData($tMX1, 1, $fY, 8)
    	DllStructSetData($tMX1, 1, $fZ, 12)
    
    
    	Switch $iO
    		Case False
    			$tMX = _MX3D_MulMatrix($tMX1, $tMX)
    		Case Else
    			$tMX = _MX3D_MulMatrix($tMX, $tMX1)
    	EndSwitch
    
    
    EndFunc   ;==>_MX3D_Translate
    
    
    
    
    Func _MX3D_MulMatrix($tMX1, $tMX2)
    	Local $tMX = DllStructCreate("double[16];")
    
    
    	Local $fS
    	For $x = 0 To 2
    		For $y = 0 To 3
    			$fS = 0
    			For $z = 0 To 3
    				$fS += DllStructGetData($tMX2, 1, $x * 4 + $z + 1) * DllStructGetData($tMX1, 1, $z * 4 + $y + 1)
    			Next
    			DllStructSetData($tMX, 1, $fS, $x * 4 + $y + 1)
    		Next
    	Next
    
    
    	DllStructSetData($tMX, 1, 1, 16)
    
    
    	Return $tMX
    EndFunc   ;==>_MX3D_MulMatrix
    
    
    
    
    Func _MX3D_MulVector($tMX, $fX, $fY, $fZ, ByRef $fRX, ByRef $fRY, ByRef $fRZ)
    	$fRX = ($fX * DllStructGetData($tMX, 1, 1)) + ($fY * DllStructGetData($tMX, 1, 2)) + ($fZ * DllStructGetData($tMX, 1, 3)) + DllStructGetData($tMX, 1, 4)
    	$fRY = ($fX * DllStructGetData($tMX, 1, 5)) + ($fY * DllStructGetData($tMX, 1, 6)) + ($fZ * DllStructGetData($tMX, 1, 7)) + DllStructGetData($tMX, 1, 8)
    	$fRZ = ($fX * DllStructGetData($tMX, 1, 9)) + ($fY * DllStructGetData($tMX, 1, 10)) + ($fZ * DllStructGetData($tMX, 1, 11)) + DllStructGetData($tMX, 1, 12)
    	Return True
    EndFunc   ;==>_MX3D_MulVector
    Alles anzeigen


    Da du ja nur die Vorderseite benötigst, reicht es, wenn du "$fTheta = Random(0, $cPI)" schreibst.


    LgE

  • Solitaire classic mit größeren Karten

    • eukalyptus
    • 9. Januar 2016 um 11:28

    Wie viele Einträge im Internet beweisen, bin ich nicht der einzige, der das alte Solitär-Spiel aus Windows XP mitgenommen hat und noch immer verwendet.
    Die neueren Versionen von Microsoft konnten, trotz besserer Grafik, leider nicht mithalten.
    Einfach Sol.exe und Cards.dll kopiert und man konnte auch mit den neuen Windowsversionen sein gewohntes Kartenspiel zeitvertreiben.

    Leider hat die Classic-Version von Solitär eine fixe Auflösung der Spielkarten, was einem ungetrübten Spielspaß mit großer Bildschirmauflösung entgegenwirkt.
    (Und nein, es ist NICHT die langsam einsetzende Altersweitsichtigkeit!! :D )

    Ich hab nun aus diesem Grund meine eigene Cards.dll geschrieben.
    Damit lässt sich die Große der Spielkarten ganz einfach anpassen.

    In diesem Paket befinden sich alle nötigten Dateien (Sol.exe, Cards.dll, Cards.png, Cards.ini):
    Download: Solitaire.7z

    Die Cards.ini enthält die Auflösung der Spielkarten und kann leicht mit einem Texteditor bearbeitet werden.
    Cards.png enthält die Spielkarten und könnte auch durch ein anderes Kartendeck, bzw. den wirklich originalen Rückseiten aus Windows 95 ersetzt werden.

    Wer Angs vor Viren hat, kann sich die Sol.exe aus einem alten Windows(XP) kopieren und die Cards.dll selber kompilieren, hier ist der Freebasic-Sourcecode:

    Code
    #Include Once "win\gdiplus.bi"
    Using GDIPLUS
    
    
    Dim Shared As Integer iGDIP_Cnt
    Dim Shared As GdiplusStartupInput GDIP_SI
    Dim Shared As ULong_Ptr GDIP_Token
    Dim Shared As GpImage Ptr hIMG
    
    
    Dim Shared As Integer iCardW, iCardH
    iGDIP_Cnt = 0
    
    
    Function _DrawCard(hDC As UInteger, iX As Integer, iY As Integer, iW As Integer, iH As Integer, iCard As Integer, iType As Integer, iColor As UInteger) As Integer
    	If iGDIP_Cnt < 1 Then Return 0
    	Dim As GpHatch Ptr hBRSH
    	Dim As GpGraphics Ptr hGFX
    	GdipCreateFromHDC(hDC, @hGFX)
    	Select Case iType
    		Case 1
    			Select Case iCard
    				Case 54 To 65
    					GdipDrawImageRectRectI(hGFX, hIMG, iX, iY, iW, iH, (iCard - 54) * 71, 96 * 4, 71, 96, 2, NULL, NULL, NULL)
    			End Select
    		Case 3
    			GdipDrawImageRectRectI(hGFX, hIMG, iX, iY, iW, iH, 12 * 71, 4 * 96, 71, 96, 2, NULL, NULL, NULL)
    			GdipCreateHatchBrush(44, &hFF000000, &hFF000000 Or iColor, @hBRSH)
    			GdipFillRectangleI(hGFX, hBRSH, iX+Int(iW / 35), iY+Int(iH / 48), iW-(Int(iW / 35)*2), iH-(Int(iH / 48)*2))
    			GdipDeleteBrush(hBRSH)
    		Case 7
    			GdipDrawImageRectRectI(hGFX, hIMG, iX, iY, iW, iH, 12 * 71, 4 * 96, 71, 96, 2, NULL, NULL, NULL)
    		Case Else
    			Select Case iCard
    				Case 0 To 51
    					GdipDrawImageRectRectI(hGFX, hIMG, iX, iY, iW, iH, Int(iCard / 4) * 71, Int(iCard Mod 4) * 96, 71, 96, 2, NULL, NULL, NULL)
    			End Select
    	End Select
    
    
    	GdipDeleteGraphics(hGFX)
    	Return 1
    End Function
    
    
    
    
    
    
    Extern "Windows-MS"
    
    
    Function cdtInit(ByRef iW As Integer, ByRef iH As Integer) As Integer Export
    
    
    	iGDIP_Cnt += 1
    	If iGDIP_Cnt = 1 Then
    		GDIP_SI.GdiplusVersion = 1
    		GdiplusStartup(@GDIP_Token, @GDIP_SI, NULL)
    		GdipLoadImageFromFile(WStr(CurDir & "\cards.png"), @hIMG)
    	EndIf
    	Dim As Integer iValue
    	Dim As String sPath, sValue
    	sPath = CurDir & "\cards.ini"
    	iCardW = 71
    	iCardH = 96
    	Var hFile = FreeFile
    	If Open(sPath For Input As #hFile) = 0 Then
    		Line Input #hFile, sValue
    		iValue = Cast(Integer, sValue)
    		If iValue > 0 and iValue < 1000 Then iCardW = iValue
    
    
    		Line Input #hFile, sValue
    		iValue = Cast(Integer, sValue)
    		If iValue > 0 and iValue < 1000 Then iCardH = iValue
    		Close #hFile
    	EndIf
    	iW = iCardW
    	iH = iCardH
    	Return 1
    End Function
    
    
    Function cdtDraw(hDC As UInteger, iX As Integer, iY As Integer, iCard As Integer, iType As Integer, iColor As UInteger) As Integer Export
    	Return _DrawCard(hDC, iX, iY, iCardW, iCardH, iCard, iType, iColor)
    End Function
    
    
    Function cdtDrawExt(hDC As UInteger, iX As Integer, iY As Integer, iW As Integer, iH As Integer, iCard As Integer, iType As Integer, iColor As UInteger) As Integer Export
    	Return _DrawCard(hDC, iX, iY, iW, iH, iCard, iType, iColor)
    End Function
    
    
    Function cdtAnimate(hDC As UInteger, iCardBack As UInteger, iX As Integer, iY As Integer, iFrame As Integer) As Integer Export
    	Return 0
    End Function
    
    
    Sub cdtTerm Export
    	iGDIP_Cnt -= 1
    	If iGDIP_Cnt <= 0 Then
    		iGDIP_Cnt = 0
    		GdipDisposeImage(hIMG)
    		GdiplusShutdown(GDIP_Token)
    	EndIf
    End Sub
    
    
    End Extern
    Alles anzeigen

    Auch andere Klassiker benutzen die Cards.dll, jedoch hab ich noch nicht alle Funktionen korrekt umgesetzt - d.h. wahrscheinlich wird meine Version nicht zu 100% mit bsw. Spider-Solitär funktionieren.
    Bei Bedarf kann ich das aber noch nachholen!


    Viel Spaß
    E

  • Über die String-Dekompression

    • eukalyptus
    • 8. Januar 2016 um 16:57

    Hab nur das hier gefunden, weiß jetzt auf die schnelle nicht, ob das auch der richtige Code ist... (schon lange her)

    Code
    #include <AssembleIt.au3>
    ; 33       =   1 Pad
    
    
    ;Comp:
    ; 35 -  50 =  16 Cnt Chr
    ; 51 -  66 =  16 Hex Chr
    ; 67 -  82 =  16 Buf Chr (BufferLen, BufferPos)
    ; 83 - 255 = 173 PM  Chr
    
    
    ;Def:
    ; 35 -  50 =  16 Hex Chr
    ; 51 -  66 =  16 Buf Chr
    ; 67 - 255 = 189 Single Hex Chr 00-BD
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    Func _ASM_CompBuf()
    	_("use32");32Bit!
    
    
    	;3 Buffer
    	;xmm7 = Buffer 3
    	;xmm6 = Buffer 2
    	;xmm5 = Buffer 1
    	;xmm4 = Bytes
    	;xmm3 = Cmp
    	;xmm2 = ByteLen-BufPos
    	;xmm1 = Size
    
    
    	;eax = 0,0,0,0
    	;ebx = 0,0,0,0
    	;ecx = 0,0,ByteLen,BufPos
    	;edx = pBuf
    
    
    	_("mov esi, [esp+4]");pData
    	_("mov edi, [esp+8]");pComp
    	_("mov edx, [esp+12]");pBuf
    	_("mov ebx, [esp+16]");iSize
    
    
    	_("_Loop:")
    		_("movd xmm1, ebx");Store iSize
    		_("movdqu xmm4, [esi]")
    
    
    		;Compare Buffer
    		;Load Buffer
    		_("movdqu xmm5, [edx+1]")
    		_("movdqu xmm6, [edx+17]")
    		_("movdqu xmm7, [edx+33]")
    
    
    		_("mov cl, 0");Reset BufPos
    		_("pxor xmm2, xmm2");Reset ByteLen-BufPos
    		_("_LoopChkBuf:")
    			_("movdqa xmm3, xmm4")
    			_("pcmpeqb xmm3, xmm5")
    			_("pmovmskb eax, xmm3")
    			_("mov ebx, 1")
    			_("mov ch, 0");Reset ByteLen
    			_("_LoopByteLen:")
    				_("test eax, ebx")
    				_("jz _BufferFound")
    				_("Shl ebx, 1")
    				_("Add ch, 1")
    				_("cmp ch, 15")
    				_("jb _LoopByteLen")
    
    
    			_("_BufferFound:")
    				_("movd ebx, xmm2")
    				_("cmp bh, ch");LastByteLen > CurByteLen?
    				_("ja _OldBufLen")
    					_("movd xmm2, ecx")
    				_("_OldBufLen:")
    
    
    			;Shift Buffer:
    			_("psrldq xmm5, 1")
    			_("movdqa xmm0, xmm6")
    			_("pslldq xmm0, 15")
    			_("por xmm5, xmm0")
    			_("psrldq xmm6, 1")
    			_("movdqa xmm0, xmm7")
    			_("pslldq xmm0, 15")
    			_("por xmm6, xmm0")
    			_("psrldq xmm7, 1")
    
    
    			_("add cl, 1")
    			_("cmp cl, [edx]");BufCnt
    			_("jb _LoopChkBuf")
    
    
    		_("_BufferWrite:")
    			_("movd ecx, xmm2");Get ByteLen-BufPos
    
    
    			_("movd ebx, xmm1");Restore iSize
    			_("movzx eax, ch")
    			_("cmp eax, ebx");CurByteLen > iSize
    			_("jbe _ContBufWrite")
    				_("mov ch, bl")
    
    
    			_("_ContBufWrite:")
    			_("cmp ch, 2")
    			_("jb _BufWriteByte")
    				_("cmp cl, 15")
    				_("ja _Buffer2")
    					_("mov ax, cx")
    					_("add ax, 0x4343");= BufChr BufChr
    					_("mov [edi], ax")
    					_("add edi, 2")
    					_("jmp _BufferAdd")
    
    
    				_("_Buffer2:")
    					_("cmp cl, 31")
    					_("ja _Buffer3")
    					_("mov ax, cx")
    					_("sub al, 16")
    					_("add ax, 0x3343");= BufChr HexChr
    					_("mov [edi], ax")
    					_("add edi, 2")
    					_("jmp _BufferAdd")
    
    
    				_("_Buffer3:")
    					_("mov ax, cx")
    					_("sub al, 32")
    					_("add ax, 0x4333");= HexChr BufChr
    					_("mov [edi], ax")
    					_("add edi, 2")
    					_("jmp _BufferAdd")
    
    
    			_("_BufWriteByte:")
    				_("pextrw eax, xmm4, 0")
    				_("mov ch, 1");ByteLen = 1
    				_("mov ah, al")
    				_("shr ah, 4")
    				_("and al, 0xF")
    				_("add ax, 0x3333");= HexChr
    				_("mov [edi], ax")
    				_("add edi, 2")
    
    
    		_("_BufferAdd:")
    			_("mov al, [edx]");BufCnt
    			_("add al, ch");+ByteLen
    			_("cmp al, 48")
    			_("jbe _NoBufSHR")
    				_("sub al, 48")
    				_("movzx eax, al");=BufSHR
    				_("movdqu xmm7, [edx+eax+1]")
    				_("movdqu xmm6, [edx+eax+17]")
    				_("movdqu xmm5, [edx+eax+33]")
    				_("movdqu [edx+1], xmm7")
    				_("movdqu [edx+17], xmm6")
    				_("movdqu [edx+33], xmm5")
    				_("sub [edx], al")
    
    
    			_("_NoBufSHR:")
    				_("movzx eax, byte[edx]")
    				_("movdqu [edx+eax+1], xmm4");Add Bytes to Buffer
    				_("add al, ch")
    				_("pxor xmm0, xmm0")
    				_("movdqu [edx+eax+1], xmm0");Trim to ByteLen
    				_("add [edx], ch")
    
    
    		_("movzx eax, ch");ByteLen
    		_("add esi, eax")
    		_("movd ebx, xmm1");Restore iSize
    		_("sub ebx, eax")
    		_("cmp ebx, 0")
    		_("ja _Loop")
    
    
    	_("_Exit:")
    	_("ret ")
    EndFunc
    
    
    
    
    
    
    
    
    
    
    Func _ASM_Comp()
    	_("use32");32Bit!
    
    
    	_("mov esi, [esp+4]");pComp
    	_("mov edi, [esp+8]");pPMut
    
    
    	;Fill PM Array
    	_("mov cl, 0x33")
    	_("add edi, 2")
    	_("_LoopFillPM_LO:")
    		_("mov ch, 0x33")
    		_("_LoopFillPM_HI:")
    			_("mov [edi], cx")
    			_("add edi, 4")
    			_("add ch, 1")
    			_("cmp ch, 0x53")
    			_("jb _LoopFillPM_HI")
    		_("add cl, 1")
    		_("cmp cl, 0x53")
    		_("jb _LoopFillPM_LO")
    
    
    	;Cnt PM
    	_("mov edi, [esp+8]");pPMut
    	_("_LoopCntPM:")
    		_("mov ax, [esi]")
    		_("add esi, 1")
    		_("cmp ah, 0")
    		_("jz _BubbleSort")
    
    
    		_("sub ax, 0x3333")
    		_("movzx ebx, ah")
    		_("movzx edx, al")
    		_("shl ebx, 7")
    		_("shl edx, 2")
    		_("add ebx, edx")
    		_("mov cx, [edi+ebx]")
    		_("cmp cx, 0xFFFF")
    		_("je _NoAddCnt")
    			_("add word[edi+ebx], 1")
    		_("_NoAddCnt:")
    			_("jmp _LoopCntPM")
    
    
    
    
    	;Sort PMut Array => Cnt
    	_("_BubbleSort:")
    		_("mov ecx, 0")
    		_("_LoopSort1:")
    
    
    			_("mov edx, 1022");32x32-2
    			_("_LoopSort2:")
    				_("mov esi, edx")
    				_("shl esi, 2")
    				_("mov eax, [edi+esi]")
    				_("mov ebx, [edi+esi+4]");Next
    
    
    				_("cmp ax, bx");Cnt
    				_("jae _NoBSort")
    					_("mov [edi+esi], ebx")
    					_("mov [edi+esi+4], eax")
    				_("_NoBSort:")
    
    
    				_("dec edx")
    				_("cmp edx, ecx")
    				_("jge _LoopSort2")
    
    
    			_("inc ecx")
    			_("cmp ecx, 1023")
    			_("jb _LoopSort1")
    
    
    	;Replace PM
    	;eax = 0,0,Byte-Byte
    	;ebx = 0,0,Rep-Rep
    	;ecx = 0,0,RepCnt,PMCnt
    	;edx = 0,0,PM-PM
    	_("mov bx, 0x2100")
    	_("mov cx, 0")
    	_("_LoopRepPM:")
    		_("mov dx, [edi]")
    		_("cmp dx, 2")
    		_("jb _ExitRepPM")
    		_("mov dx, [edi+2]");PM
    
    
    		_("mov esi, [esp+4]");pComp
    		_("mov ch, 0")
    		_("mov bl, cl")
    		_("add bl, 83");=0x21PM
    		_("_LoopRep:")
    			_("mov ax, [esi]")
    			_("cmp al, 0")
    			_("jz _ContRepPM")
    			_("cmp ah, 0")
    			_("jz _ContRepPM")
    				_("cmp ax, dx");CurWord = PM Word?
    				_("jne _NoRepPM")
    					_("mov [esi], bx")
    					_("add esi, 1")
    					_("mov ch, 1")
    			_("_NoRepPM:")
    				_("add esi, 1")
    				_("jmp _LoopRep")
    
    
    		_("_ContRepPM:")
    			_("cmp ch, 0")
    			_("jz _NoReplacedPM")
    				_("add cl, 1")
    			_("_NoReplacedPM:")
    		_("movzx dx, ch")
    		_("mov [edi], dx")
    		_("add edi, 4")
    		_("cmp cl, 173")
    		_("jb _LoopRepPM")
    
    
    	_("_ExitRepPM:")
    		_("mov dx, -1");Terminate
    		_("mov [edi], dx")
    
    
    	;Remove 0x21
    	_("mov esi, [esp+4]");pComp
    	_("mov edi, esi")
    	_("_LoopRem21:")
    		_("mov al, [esi]")
    		_("add esi, 1")
    		_("cmp al, 0")
    		_("jz _ExitRem21")
    		_("cmp al, 0x21")
    		_("jbe _LoopRem21")
    			_("mov [edi], al")
    			_("add edi, 1")
    		_("jmp _LoopRem21")
    
    
    	_("_ExitRem21:")
    		_("mov byte[edi], 0");Terminate
    
    
    	;Define
    	_("mov esi, [esp+8]");pPMut
    	_("mov edi, [esp+12]");pDef
    	_("_LoopDef:")
    		_("mov dx, [esi]")
    		_("cmp dx, 0")
    		_("jl _ExitDef")
    		_("cmp dx, 0")
    		_("jz _ContDef")
    			_("mov dx, [esi+2]");PM
    			_("cmp dl, 0x42")
    			_("ja _NoHexDef")
    				_("cmp dh, 0x42")
    				_("ja _NoHexDef")
    					_("mov ax, dx")
    					_("sub ax, 0x3333")
    					_("shl ah, 4")
    					_("or al, ah")
    					_("cmp al, 0xBC")
    					_("ja _NoHexDef")
    						_("add al, 67")
    						_("mov [edi], al")
    						_("add edi, 1")
    						_("jmp _ContDef")
    
    
    			_("_NoHexDef:")
    				_("sub dx, 0x1010")
    				_("mov [edi], dx")
    				_("add edi, 2")
    
    
    			_("_ContDef:")
    				_("add esi, 4")
    				_("jmp _LoopDef")
    
    
    	_("_ExitDef:")
    		_("mov byte [edi], 0x21")
    
    
    	;CompCnt
    	_("mov esi, [esp+4]");pComp
    	_("mov edi, esi")
    	_("mov edx, 1")
    	_("_LoopCnt:")
    		_("mov al, [esi]")
    		_("add esi, 1")
    		_("cmp al, [esi]");Byte = NextByte?
    		_("je _CntPlus")
    			_("mov [edi], al")
    			_("add edi, 1")
    			_("cmp edx, 2")
    			_("jb _NoCnt")
    			_("_WriteCnt:")
    				_("mov ebx, edx")
    				_("shr edx, 4");Next 4
    				_("and ebx, 0x0F")
    				_("add ebx, 35");=Cnt
    				_("mov [edi], bl");WriteCnt
    				_("add edi, 1")
    				_("cmp edx, 0")
    				_("jnz _WriteCnt")
    
    
    			_("_NoCnt:")
    				_("mov edx, 0")
    
    
    		_("_CntPlus:")
    			_("add edx, 1")
    
    
    		_("cmp al, 0x21")
    		_("jb _ExitCompCnt")
    		_("jmp _LoopCnt")
    
    
    	_("_ExitCompCnt:")
    		_("pxor xmm0, xmm0")
    		_("movdqu [edi], xmm0");Terminate
    
    
    	_("ret ")
    EndFunc
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    Func _ASM_DeCompBufCalcSize()
    	_("use32");32Bit!
    
    
    	_("mov esi, dword[esp+4]");pComp
    
    
    	_("mov eax, 0")
    	_("_Loop:")
    		_("mov bx, [esi]")
    		_("add esi, 2")
    		_("cmp bl, 0")
    		_("jz _Exit")
    		_("cmp bh, 0")
    		_("jz _Exit")
    
    
    		;Buf1 = Buf-Buf
    		;Buf2 = Buf-Hex
    		;Buf3 = Hex-Buf
    		_("cmp bl, 66")
    		_("ja _Buf1")
    		_("cmp bh, 66")
    		_("ja _Buf3")
    			_("add eax, 1")
    			_("jmp _Loop")
    
    
    		_("_Buf1:")
    			_("cmp bh, 66")
    			_("ja _Buf3")
    			_("movzx edx, bh");= BufLen
    			_("sub dl, 51")
    			_("add eax, edx")
    			_("jmp _Loop")
    
    
    		_("_Buf3:")
    			_("movzx edx, bh");= BufLen
    			_("sub dl, 67")
    			_("add eax, edx")
    			_("jmp _Loop")
    
    
    	_("_Exit:")
    	_("ret ")
    EndFunc
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    Func _ASM_DeCompBuf()
    	_("use32");32Bit!
    
    
    	_("mov esi, dword[esp+4]");pComp
    	_("mov edi, dword[esp+8]");pDeComp
    	_("mov edx, dword[esp+12]");pBuf
    
    
    	;xmm7 = Buffer 3
    	;xmm6 = Buffer 2
    	;xmm5 = Buffer 1
    	;xmm4 = WriteByte
    	;xmm3 = 00000000000000000000000000000000
    
    
    	;ecx = 0,0,ByteLen,BufPos
    
    
    	;Buf1 = Buf-Buf
    	;Buf2 = Buf-Hex
    	;Buf3 = Hex-Buf
    	_("pxor xmm3, xmm3")
    	_("_Loop:")
    		_("mov ax, [esi]")
    		_("add esi, 2")
    		_("cmp al, 0")
    		_("jz _Exit")
    
    
    		_("cmp al, 0x42")
    		_("ja _Buf1")
    
    
    		_("cmp ah, 0x43")
    		_("jb _Hex")
    		;Buf3:
    			_("sub ax, 0x4313")
    			_("mov cx, ax")
    			_("jmp _BufferGet")
    
    
    		_("_Buf1:");Buf1 / Buf2
    			_("cmp ah, 0x43")
    			_("jb _Buf2")
    			_("sub ax, 0x4343")
    			_("mov cx, ax")
    			_("jmp _BufferGet")
    
    
    		_("_Buf2:")
    			_("sub ax, 0x3333")
    			_("mov cx, ax")
    			_("jmp _BufferGet")
    
    
    		_("_Hex:")
    			_("sub ax, 0x3333")
    			_("shl ah, 4")
    			_("or al, ah")
    			_("movzx eax, al")
    			_("movd xmm4, eax")
    			_("mov ch, 1")
    			_("jmp _BufferAdd")
    
    
    		_("_BufferGet:")
    			_("movzx ebx, cl")
    			_("movdqu xmm4, [edx+ebx+1]")
    
    
    		_("_BufferAdd:")
    			_("movdqu [edi], xmm4")
    			_("movzx eax, ch")
    			_("add edi, eax")
    
    
    			_("mov al, [edx]");BufCnt
    			_("add al, ch");+ByteLen
    			_("cmp al, 48")
    			_("jbe _NoBufSHR")
    				_("sub al, 48")
    				_("movzx eax, al");=BufSHR
    				_("movdqu xmm7, [edx+eax+1]")
    				_("movdqu xmm6, [edx+eax+17]")
    				_("movdqu xmm5, [edx+eax+33]")
    				_("movdqu [edx+1], xmm7")
    				_("movdqu [edx+17], xmm6")
    				_("movdqu [edx+33], xmm5")
    				_("sub [edx], al")
    
    
    			_("_NoBufSHR:")
    				_("movzx eax, byte[edx]")
    				_("movdqu [edx+eax+1], xmm4");Add Bytes to Buffer
    				_("add al, ch")
    				_("movdqu [edx+eax+1], xmm3");Trim to ByteLen
    				_("add [edx], ch")
    
    
    		_("jmp _Loop")
    
    
    	_("_Exit:")
    	_("ret ")
    EndFunc
    
    
    
    
    Func _ASM_DeCompPrepare()
    	_("use32");32Bit!
    
    
    	_("mov esi, dword[esp+4]");pComp
    	_("mov edi, dword[esp+8]");pPMut
    
    
    	_("_LoopDef:")
    		_("mov ax, [esi]")
    		_("cmp al, 0x21")
    		_("jbe _CalcSize")
    
    
    		_("cmp al, 67")
    		_("jb _DoubleHex")
    			;Single Hex Chr
    			_("sub al, 67")
    			_("mov ah, al")
    			_("shr ah, 4")
    			_("and al, 0xF")
    			_("add ax, 0x3333");=Hex Chr
    			_("mov [edi], ax")
    			_("add edi, 2")
    			_("add esi, 1")
    			_("jmp _LoopDef")
    
    
    		_("_DoubleHex:")
    			_("add ax, 0x1010");= Hex Chr
    			_("mov [edi], ax")
    			_("add edi, 2")
    			_("add esi, 2")
    			_("jmp _LoopDef")
    
    
    	_("_CalcSize:")
    		_("add esi, 1");Skip 0x21
    
    
    	_("mov eax, 0")
    	_("_LoopSize:")
    		_("mov ch, [esi]")
    		_("cmp ch, 0")
    		_("jz _Exit")
    
    
    		_("mov edx, 0")
    		_("mov cl, 0")
    		_("_LoopCnt:")
    			_("movzx ebx, byte[esi+1]")
    			_("cmp bl, 50")
    			_("ja _AddCnt")
    			_("cmp bl, 35")
    			_("jb _AddCnt")
    			_("add esi, 1")
    			_("sub bl, 35")
    			_("shl ebx, cl")
    			_("add cl, 4")
    			_("or edx, ebx")
    			_("jmp _LoopCnt")
    
    
    		_("_AddCnt:")
    			_("add esi, 1")
    			_("cmp ch, 82")
    			_("ja _LoopPMut")
    				_("_LoopHex:")
    					_("add eax, 1")
    					_("sub edx, 1")
    					_("jg _LoopHex")
    				_("jmp _LoopSize")
    
    
    				_("_LoopPMut:")
    					_("add eax, 2")
    					_("sub edx, 1")
    					_("jg _LoopPMut")
    				_("jmp _LoopSize")
    
    
    	_("_Exit:")
    	_("ret ")
    EndFunc
    
    
    
    
    
    
    Func _ASM_DeCompPMut()
    	_("use32");32Bit!
    
    
    	_("mov esi, dword[esp+4]");pComp
    	_("mov edi, dword[esp+8]");pDeComp
    	_("mov edx, dword[esp+12]");pPMut
    
    
    	_("_LoopDef:")
    		_("mov al, [esi]")
    		_("add esi, 1")
    		_("cmp al, 0x21")
    		_("jbe _Expand")
    		_("jmp _LoopDef")
    
    
    	_("_Expand:")
    
    
    	;Expand
    	;eax = 0,0,0,0
    	;ebx = Cnt
    	;ecx = 0,0,byte,shift
    	;edx = pPMut
    	;_("sub esi, 1")
    	;_("mov edx, dword[esp+12]");pPMut
    
    
    	_("_LoopExp:")
    		_("mov ch, [esi]")
    
    
    		_("cmp ch, 0")
    		_("jz _ExitExp")
    
    
    		_("mov ebx, 0")
    		_("mov cl, 0")
    		_("_LoopCnt:")
    			_("movzx eax, byte[esi+1]")
    
    
    			_("cmp al, 50")
    			_("ja _Write")
    			_("cmp al, 35")
    			_("jb _Write")
    
    
    			_("add esi, 1")
    			_("sub al, 35")
    			_("shl eax, cl")
    			_("add cl, 4")
    			_("or ebx, eax")
    			_("jmp _LoopCnt")
    
    
    		_("_Write:")
    			_("add esi, 1")
    			_("cmp ch, 82")
    			_("ja _PMut")
    				_("_LoopHex:")
    					_("mov [edi], ch")
    					_("add edi, 1")
    					_("sub ebx, 1")
    					_("jg _LoopHex")
    				_("jmp _LoopExp")
    
    
    			_("_PMut:")
    				_("sub ch, 83")
    				_("movzx eax, ch")
    				_("shl eax, 1");Word
    				_("mov cx, [edx+eax]");get PMut
    
    
    				_("_LoopPMut:")
    					_("mov [edi], cx")
    					_("add edi, 2")
    					_("sub ebx, 1")
    					_("jg _LoopPMut")
    				_("jmp _LoopExp")
    
    
    	_("_ExitExp:")
    	_("ret ")
    EndFunc
    Alles anzeigen
  • Konsolenanwendung mit "StdoutRead" nur mitlesen

    • eukalyptus
    • 8. Januar 2016 um 16:44

    Mir fallen 2 Möglichkeiten ein:

    1) "Eigenes" Consolenfenster
    Du startest Run mit dem Parameter @SW_HIDE und erstellst selber eine GUI in welcher du deie gelesenen Daten ausgibst


    2) Mit einer Pipe auf ein eigenes externes Tool weiterleiten
    Zunächst kompilierst du dieses Script als Pipe.exe:

    AutoIt
    #AutoIt3Wrapper_Change2CUI = y
    #include <WinAPI.au3>
    #include <NamedPipes.au3>
    
    
    Global Const $sPIPE_NAME = "\\.\pipe\AutoItPipe"
    
    
    If $CmdLine[0] <> 1 Then Exit
    Global $hPipe = $CmdLine[1]
    
    
    
    
    Global $hPipe = _WinAPI_CreateFile($sPIPE_NAME, 2, 4)
    Global $tBuffer, $iWritten, $iStatus
    
    
    Global $sStd
    While 1
    	$sStd = ConsoleRead()
    	If @error Then ExitLoop
    	If $sStd Then
    		$tBuffer = DllStructCreate("char[" & StringLen($sStd) & "];")
    		DllStructSetData($tBuffer, 1, $sStd)
    		$iStatus = _WinAPI_WriteFile($hPipe, $tBuffer, DllStructGetSize($tBuffer), $iWritten, 0)
    
    
    		ConsoleWrite($sStd)
    	EndIf
    WEnd
    
    
    $tBuffer = DllStructCreate("byte;")
    DllStructSetData($tBuffer, 1, 0x1A)
    _WinAPI_WriteFile($hPipe, $tBuffer, DllStructGetSize($tBuffer), $iWritten, 0) ;EndOfFile
    _WinAPI_CloseHandle($hPipe)
    Alles anzeigen

    Im Hauptscript erstellst du eine NamedPipe.
    Dessen Handle übergibst du an Pipe.exe und mit dem Zeichen "|" leitest du den Output an Pipe.exe weiter
    In etwa so:

    AutoIt
    #include <WinAPI.au3>
    #include <NamedPipes.au3>
    
    
    Global Const $sPIPE_NAME = "\\.\pipe\AutoItPipe"
    Global Const $iBufferSize = 512
    
    
    
    
    Global $hPipe = _NamedPipes_CreateNamedPipe($sPIPE_NAME, 0, 0, 0, 0, 0, 1, 1, $iBufferSize, $iBufferSize)
    _NamedPipes_WaitNamedPipe($sPIPE_NAME)
    Global $tBuffer = DllStructCreate("char[" & $iBufferSize & "];")
    
    
    Global $iPID = Run(@ComSpec & " /c " & 'Test.exe | Pipe.exe ' & $hPipe & ' 2>&1', @ScriptDir, @SW_SHOW)
    
    
    
    
    Global $sOutput = ""
    Global $iRead
    While 1
    	If _WinAPI_ReadFile($hPipe, $tBuffer, $iBufferSize, $iRead, 0) Then
    		If DllStructGetData($tBuffer, 1, $iRead) = Chr(0x1A) Then ExitLoop
    
    
    		$sOutput &= DllStructGetData($tBuffer, 1)
    		ToolTip($sOutput)
    	EndIf
    WEnd
    
    
    MsgBox(0, "", "Output " & $sOutput)
    
    
    _WinAPI_CloseHandle($hPipe)
    Alles anzeigen


    Pipe.exe bekommt nun via StdIn die Daten, schreibt diese in die NamedPipe und parallel dazu wieder in die Console
    Das Haupscript erhält die Daten über die NamedPipe.

    "|" leitet den Output weiter an Pipe.exe
    "2>&1" leitet auch den StdErr an StdOut um, und somit auch an Pipe.exe

    Damit das Hauptscript weiß, wann die Daten zu Ende sind, schreib ich "0x1A" ans Ende der Pipe.
    Wahrscheinlich gibts eine sicherere Methode, aber da bin ich der falsche Ansprechpartner... :rolleyes:

    Edit:
    Kommt auch drauf an, wass du erreichen willst!
    Evtl reicht es doch auch, wenn du im Hauptscript mit RunWait startest und die Auswertung komplett in Pipe.exe stattfindet!
    Dann würdest du dir den Rückschliff via NamedPipe ersparen!

  • Problem mit Listviewauswahl

    • eukalyptus
    • 23. Dezember 2015 um 00:21

    Contextmenü nicht direkt im Listview erstellen, sondern mithilfe eines Dummycontrols:

    AutoIt
    Global $hGui = GUICreate("ListView", 400, 300)
    $idListview = GUICtrlCreateListView("", 2, 2, 394, 268)
    Global $cDummy = GUICtrlCreateDummy()
    Global $CM = GUICtrlCreateContextMenu($cDummy)


    Und noch folgendes in die Hauptschleife einfügen:

    AutoIt
    Case $GUI_EVENT_SECONDARYDOWN
        If _GUICtrlListView_GetSelectedCount($idListview) = 1 Then DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", GUICtrlGetHandle($CM), "int", 0, "int", MouseGetPos(0), "int", MouseGetPos(1), "hwnd", $hGui, "ptr", 0)


    E

  • GDI+ HeatMap V2

    • eukalyptus
    • 22. Dezember 2015 um 11:53

    Ein kleines Script, welches eine Remap-Tabelle benutzt.
    In diesem Fall werden Graustufen in verschiedene Farben umgewandelt.

    AutoIt
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    
    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)
    
    
    
    
    Global $iRadius = 60
    Global $iAlpha = 0x20
    
    
    
    
    Global $iWidth = @DesktopWidth
    Global $iHeight = @DesktopHeight
    
    
    Global $hGDIP = _GDIPlus_Startup()
    Global $hGui = GUICreate("", $iWidth, $iHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    
    
    Global $tLayered = DllStructCreate("int X; int Y; int W; int H; int Src[2]; byte Blend[4];")
    $tLayered.Blend(3) = 0xFF
    $tLayered.Blend(4) = 1
    $tLayered.W = $iWidth
    $tLayered.H = $iHeight
    
    
    Global $hDC = _WinAPI_GetDC($hGui)
    Global $hBitmap = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
    Global $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    Global $hCDC = _WinAPI_CreateCompatibleDC($hDC)
    Global $hOBJ = _WinAPI_SelectObject($hCDC, $hBMP)
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hCDC)
    
    
    $hBitmap = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $GDIP_PXF32RGB)
    Global $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;_GDIPlus_GraphicsSetSmoothingMode($hContext, 2)
    
    
    Global $hImgAttr = _CalcRemapTable()
    
    
    Global $hPath = _GDIPlus_PathCreate()
    _GDIPlus_PathAddEllipse($hPath, -$iRadius, -$iRadius, $iRadius * 2, $iRadius * 2)
    Global $hBrush = _GDIPlus_PathBrushCreateFromPath($hPath)
    _GDIPlus_PathDispose($hPath)
    _GDIPlus_PathBrushSetCenterColor($hBrush, BitOR(0x00FFFFFF, BitShift($iAlpha, -24)))
    _GDIPlus_PathBrushSetSurroundColor($hBrush, 0)
    
    
    GUISetState()
    
    
    
    
    While Sleep(10)
    	_DrawHeatMap()
    	_WinAPI_UpdateLayeredWindow($hGui, $hDC, DllStructGetPtr($tLayered, "X"), DllStructGetPtr($tLayered, "W"), $hCDC, DllStructGetPtr($tLayered, "Src"), 0, DllStructGetPtr($tLayered, "Blend"), 2)
    WEnd
    
    
    
    
    Func _DrawHeatMap()
    	Local Static $iMXOld, $iMYOld
    	Local $iMX = MouseGetPos(0)
    	Local $iMY = MouseGetPos(1)
    
    
    	If $iMX <> $iMXOld Or $iMY <> $iMYOld Then
    		_GDIPlus_GraphicsTranslateTransform($hContext, $iMX, $iMY)
    		_GDIPlus_GraphicsFillEllipse($hContext, -$iRadius, -$iRadius, $iRadius * 2, $iRadius * 2, $hBrush)
    		_GDIPlus_GraphicsResetTransform($hContext)
    	EndIf
    
    
    	_GDIPlus_GraphicsSetClipRect($hGraphics, $iMX - $iRadius, $iMY - $iRadius, $iRadius * 2, $iRadius * 2)
    	_GDIPlus_GraphicsClear($hGraphics, 0)
    	_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, $iMX - $iRadius, $iMY - $iRadius, $iRadius * 2, $iRadius * 2, $iMX - $iRadius, $iMY - $iRadius, $iRadius * 2, $iRadius * 2, $hImgAttr)
    	_GDIPlus_GraphicsResetClip($hGraphics)
    
    
    	$iMXOld = $iMX
    	$iMYOld = $iMY
    EndFunc   ;==>_DrawHeatMap
    
    
    
    
    Func _CalcRemapTable()
    	Local $tColorMap = DllStructCreate("uint[512];")
    	Local $iGrey, $iColor, $iTmp, $iR, $iB, $iG
    	For $i = 0 To 255 Step 1
    		Switch $i
    			Case 235 To 255
    				$iTmp = 255 - $i
    				$iR = 255 - $iTmp
    				$iG = $iTmp * 12
    				$iB = 0
    			Case 200 To 234
    				$iTmp = 234 - $i
    				$iR = 255 - ($iTmp * 8)
    				$iG = 255
    				$iB = 0
    			Case 150 To 199
    				$iTmp = 199 - $i
    				$iR = 0
    				$iG = 255
    				$iB = $iTmp * 5
    			Case 100 To 149
    				$iTmp = 149 - $i
    				$iR = 0
    				$iG = 255 - ($iTmp * 5)
    				$iB = 255
    			Case Else
    				$iR = 0
    				$iG = 0
    				$iB = 255
    		EndSwitch
    		If $iR < 0 Then $iR = 0
    		If $iR > 0xFF Then $iR = 0xFF
    		If $iG < 0 Then $iG = 0
    		If $iG > 0xFF Then $iG = 0xFF
    		If $iB < 0 Then $iB = 0
    		If $iB > 0xFF Then $iB = 0xFF
    
    
    		$iColor = BitOR(BitShift($i, -24), BitShift($iR, -16), BitShift($iG, -8), $iB)
    		$iGrey = BitOR(0xFF000000, BitShift($i, -16), BitShift($i, -8), $i)
    
    
    		DllStructSetData($tColorMap, 1, $iGrey, $i * 2 + 1)
    		DllStructSetData($tColorMap, 1, $iColor, $i * 2 + 2)
    	Next
    
    
    	Local $hImgAttr = _GDIPlus_ImageAttributesCreate()
    	DllCall($hGDIP, "uint", "GdipSetImageAttributesRemapTable", "handle", $hImgAttr, "int", 0, "int", 1, "int", 256, "struct*", $tColorMap)
    
    
    	Return $hImgAttr
    EndFunc   ;==>_CalcRemapTable
    
    
    
    
    Func _Exit()
    	_GDIPlus_BrushDispose($hBrush)
    
    
    	_GDIPlus_ImageAttributesDispose($hImgAttr)
    
    
    	_GDIPlus_GraphicsDispose($hContext)
    	_GDIPlus_BitmapDispose($hBitmap)
    
    
    	_GDIPlus_GraphicsDispose($hGraphics)
    	_WinAPI_SelectObject($hCDC, $hOBJ)
    	_WinAPI_DeleteObject($hBMP)
    	_WinAPI_DeleteDC($hCDC)
    	_WinAPI_ReleaseDC($hGui, $hDC)
    
    
    	GUIDelete($hGui)
    	_GDIPlus_Shutdown()
    	Exit
    EndFunc   ;==>_Exit
    Alles anzeigen
  • GDI+ Wave

    • eukalyptus
    • 22. Dezember 2015 um 11:38

    Ein Workaround:

    AutoIt
    _GDIPlusEx_BitmapWarp($oBuffer, $aCoords[$iY][$iX][2], _
    						$tWarp.X1, $tWarp.Y1, _
    						$tWarp.X2 + 0.5, $tWarp.Y2, _
    						$tWarp.X3, $tWarp.Y3 + 0.5, _
    						$tWarp.X4 + 0.5, $tWarp.Y4 + 0.5)

    bzw. gleich so, ohne Umweg über die Struct (5fps mehr)

    AutoIt
    For $iY = 0 To UBound($aCoords) - 2
    	For $iX = 0 To UBound($aCoords, 2) - 2
    
    
    		_GDIPlusEx_BitmapWarp($oBuffer, $aCoords[$iY][$iX][2], _
    				$iPos_X + $aCoords[$iY][$iX][0], $iPos_Y + $aCoords[$iY][$iX][1], _
    				$iPos_X + $aCoords[$iY][$iX + 1][0] + 0.5, $iPos_Y + $aCoords[$iY][$iX + 1][1], _
    				$iPos_X + $aCoords[$iY + 1][$iX][0], $iPos_Y + $aCoords[$iY + 1][$iX][1] + 0.5, _
    				$iPos_X + $aCoords[$iY + 1][$iX + 1][0] + 0.5, $iPos_Y + $aCoords[$iY + 1][$iX + 1][1] + 0.5)
    
    
    	Next
    Next
    Alles anzeigen
  • GDI+ Wave

    • eukalyptus
    • 21. Dezember 2015 um 17:27

    Sehr geiler Effekt!

    Bitte mehr :thumbup:

  • AlignComment richtet Kommentare aus Update 13.08.2016

    • eukalyptus
    • 6. Dezember 2015 um 08:56

    Never run a changing system! :D

  • AlignComment richtet Kommentare aus Update 13.08.2016

    • eukalyptus
    • 6. Dezember 2015 um 08:33
    Zitat von Andy

    Wer aber dennoch eine "sichere" RegEx findet oder kennt um Kommentare vom Code zu trennen...


    Ich glaub, sowas hab ich in meiner Sammlung:
    (Mit der Zeile 6 lässt sich auch das Problem mit der Leerzeile am Schluß beheben...)

    AutoIt
    $sScript = FileRead(@ScriptDir & "\Align_TestScript.au3")
    $sTmp = _MarkComments($sScript)
    ;ConsoleWrite($sTmp)
    
    
    
    
    $aLines = StringRegExp($sTmp & @CRLF, "(.*)\R", 3)
    For $i = 0 To UBound($aLines) - 1
    	If StringInStr($aLines[$i], Chr(1)) Then
    		$aSplit = StringSplit($aLines[$i], Chr(1))
    		ConsoleWrite("!" & $aSplit[1] & "<" & $aSplit[2] & ">" & @CRLF)
    	Else
    		ConsoleWrite($aLines[$i] & @CRLF)
    	EndIf
    Next
    
    
    
    
    Func _MarkComments($sScript)
    	Local $aRegExp = StringRegExp($sScript, '(?x)(\r?\n?\s*;.*)|' & '((?>"[^"]*")+|' & "(?>'[^']*')+)", 3)
    	Local $sTmp
    	For $i = 0 To UBound($aRegExp) - 1
    		$sTmp = StringStripWS($aRegExp[$i], 1)
    		If Not $sTmp Then ContinueLoop
    		If StringLeft($sTmp, 1) = ";" Then $sScript = StringReplace($sScript, $aRegExp[$i], Chr(1) & $sTmp, 1, 1)
    	Next
    	Return $sScript
    EndFunc
    Alles anzeigen


    Hier noch die "original" - Funktion mit welcher alle Comments entfernt werden können:
    Ich weiß leider nicht mehr, wer die Pattern geschrieben hat!

    AutoIt
    Func _RemoveComments(ByRef $sScript)
    	$sScript = StringRegExpReplace($sScript, '(?x)(?:\r?\n?\s*;.*)|' & '((?>"[^"]*")+|' & "(?>'[^']*')+)", "\1") ;entferne ;-Komments
    	$sScript = StringRegExpReplace($sScript, '(?i)(?:[\r\n]\s*)(\#ce|\#comments-end)(.*)', '$1') ;manche #ce haben noch Text dahinter
    	$sScript = StringRegExpReplace($sScript, '(?x)(?:\r?\n?\s*;.*)|(?s)\r?\n?\s*\#c(?>s|omments-start)(?>(?>"[^"]*")+|' & "(?>'[^']*')+|.)*?\#c(?>e|omments-end)(?-s)|" & '((?>"[^"]*")+|' & "(?>'[^']*')+)", "\1")
    EndFunc   ;==>_RemoveComments
  • GDI Plus Overlay: Bilder werden zu groß angezeigt

    • eukalyptus
    • 4. Dezember 2015 um 19:09

    Wär auch mein Tipp!

    Du kannst auch ausrechnen, wie groß das Bild wirklich gezeichnet wird:

    AutoIt
    _GDIPlus_ImageGetWidth($hImage) * 96 / _GDIPlus_ImageGetHorizontalResolution($hImage)
    _GDIPlus_ImageGetHeight($hImage) * 96 / _GDIPlus_ImageGetVerticalResolution($hImage)
  • ASM-Tricks

    • eukalyptus
    • 27. November 2015 um 18:31
    Zitat von Andy

    Hi,
    wie hier bereits beschrieben, existiert für die Berechnung einer Folge von Werten und dessen Sinus/Cosinus ein mathematischer "Trick". Dabei wird lediglich für den Startwert der Sinus/Cosinus ermittelt und dann benötigt man zur Ermittlung der folgenden Werte lediglich Additionen und Multiplikationen.
    Als "Goodie" ist die DEG-Berechnung statt RAD bereits enthalten!

    Ggf. gibt es ja mittlerweile das Pendant zu PMADDWD (Multiply and Add Packed Integers) für Floats/Double bei den SSE-Befehlen^^. Damit wäre imho das geschwindigkeitsmäßige Optimum erreicht ohne jegliche Interpolation...
    Du kannst ja mal schauen, inwieweit du das integrieren kannst/willst!

    AutoIt
    $pi = ATan(1) * 4
    $start = $pi / 180           ;erster Wert (hier gleichzeitig das Intervall)
    
    
    
    
    $a = Cos($start)             ;berechnen
    $b = Sin($start)             ;berechnen
    $sin = 0                     ;startwerte vorgegeben
    $cos = 1                     ;startwerte vorgegeben
    
    
    For $y = $start To $pi Step $start ;das Intervall ist hier der startwert -> bei Bedarf anpassen)
    
    
        $ns = $b * $cos + $a * $sin;MUL + ADD
        $nc = $a * $cos - $b * $sin;MUL + ADD
        $cos = $nc               ;das Ergebnis
        $sin = $ns               ;;das Ergebnis  ;ein evtl. benötigter Tangens reduziert sich auf ein simples DIV
        ConsoleWrite('y=' & $y / $start & @TAB & "    " & ' $sin = ' & $sin & @TAB & "    Fehler: " & $sin - Sin($y) & @CRLF) ;### Debug Console
    
    
    Next
    Alles anzeigen


    Sehr interessant!
    Wenn ich das aber richtig verstehe, dann sind mit dieser Methode keine Sweeps möglich bzw. nur umständlich zu erreichen...
    Also sowas wie das hier:

    AutoIt
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    
    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)
    
    
    Global $iWidth = 1200
    Global $iHeight = 400
    
    
    _GDIPlus_Startup()
    Global $hGui = GUICreate("Sweep", $iWidth, $iHeight + 40)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmp_Buffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfx_Buffer = _GDIPlus_ImageGetGraphicsContext($hBmp_Buffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx_Buffer, 2)
    
    
    Global $cIP_Start = GUICtrlCreateInput("1", 10, $iHeight + 10, 60, 20, BitOR(0x0800, 0x0002))
    GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 100, 1)
    GUICtrlSetOnEvent(-1, "_PlotSin")
    
    
    Global $cIP_End = GUICtrlCreateInput("10", $iWidth - 80, $iHeight + 10, 60, 20, BitOR(0x0800, 0x0002))
    GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 100, 1)
    GUICtrlSetOnEvent(-1, "_PlotSin")
    
    
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState()
    
    
    _PlotSin()
    
    
    While Sleep(10)
    WEnd
    
    
    
    
    
    
    
    
    Func _PlotSin()
    	Local $iFreq1 = GUICtrlRead($cIP_Start)
    	Local $iFreq2 = GUICtrlRead($cIP_End)
    
    
    	Local $tCurve = DllStructCreate("float[" & $iWidth * 2 & "];")
    
    
    	Local $fPhase = 0, $fPhaseInc, $fY, $fFreq
    	Local $fCY = $iHeight * 0.5
    	Local $fAmp = $iHeight * 0.4
    	Local $c2PI = ATan(1) * 8
    
    
    	For $i = 0 To $iWidth - 1
    		$fFreq = ($iFreq2 - $iFreq1) * $i / $iWidth
    
    
    		$fY = Sin($fPhase) * $fAmp + $fCY
    		DllStructSetData($tCurve, 1, $i, $i * 2 + 1)
    		DllStructSetData($tCurve, 1, $fY, $i * 2 + 2)
    
    
    		$fPhaseInc = $c2PI / $iWidth * ($iFreq1 + $fFreq)
    		$fPhase += $fPhaseInc
    	Next
    
    
    
    
    	_GDIPlus_GraphicsClear($hGfx_Buffer, 0xFF000000)
    
    
    	Local $hPen = _GDIPlus_PenCreate(0xFF00FF00, 2)
    	DllCall($__g_hGDIPDll, "int", "GdipDrawCurve2", "handle", $hGfx_Buffer, "handle", $hPen, "struct*", $tCurve, "int", $iWidth, "float", 0.5)
    	_GDIPlus_PenDispose($hPen)
    
    
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBmp_Buffer, 0, 0)
    EndFunc   ;==>_PlotSin
    
    
    
    
    
    
    
    
    
    
    
    
    Func WM_PAINT($hWnd, $iMsg, $wParam, $lParam)
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBmp_Buffer, 0, 0)
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_PAINT
    
    
    Func _Exit()
    	_GDIPlus_GraphicsDispose($hGfx_Buffer)
    	_GDIPlus_BitmapDispose($hBmp_Buffer)
    	_GDIPlus_GraphicsDispose($hGraphics)
    	_GDIPlus_Shutdown()
    	GUIDelete($hGui)
    	Exit
    EndFunc   ;==>_Exit
    Alles anzeigen
  • Rückrechnung

    • eukalyptus
    • 16. November 2015 um 07:20

    Deine Excel-Tabelle ist falsch!

    Code
    > Hex:        0x1   Dec:          1   Bin:                                1
    > Hex:        0x2   Dec:          2   Bin:                               10
    > Hex:        0x4   Dec:          4   Bin:                              100
    > Hex:        0x8   Dec:          8   Bin:                             1000
    > Hex:       0x10   Dec:         16   Bin:                            10000
    > Hex:       0x20   Dec:         32   Bin:                           100000
    > Hex:       0x40   Dec:         64   Bin:                          1000000
    > Hex:       0x80   Dec:        128   Bin:                         10000000
    > Hex:      0x100   Dec:        256   Bin:                        100000000
    > Hex:      0x200   Dec:        512   Bin:                       1000000000
    > Hex:      0x400   Dec:       1024   Bin:                      10000000000
    > Hex:      0x800   Dec:       2048   Bin:                     100000000000
    > Hex:     0x1000   Dec:       4096   Bin:                    1000000000000
    > Hex:     0x2000   Dec:       8192   Bin:                   10000000000000
    > Hex:     0x4000   Dec:      16384   Bin:                  100000000000000
    > Hex:     0x8000   Dec:      32768   Bin:                 1000000000000000
    > Hex:    0x10000   Dec:      65536   Bin:                10000000000000000
    > Hex:    0x20000   Dec:     131072   Bin:               100000000000000000
    > Hex:    0x40000   Dec:     262144   Bin:              1000000000000000000
    > Hex:    0x80000   Dec:     524288   Bin:             10000000000000000000
    > Hex:   0x100000   Dec:    1048576   Bin:            100000000000000000000
    > Hex:   0x200000   Dec:    2097152   Bin:           1000000000000000000000
    > Hex:   0x400000   Dec:    4194304   Bin:          10000000000000000000000
    > Hex:   0x800000   Dec:    8388608   Bin:         100000000000000000000000
    > Hex:  0x1000000   Dec:   16777216   Bin:        1000000000000000000000000
    > Hex:  0x2000000   Dec:   33554432   Bin:       10000000000000000000000000
    > Hex:  0x4000000   Dec:   67108864   Bin:      100000000000000000000000000
    > Hex:  0x8000000   Dec:  134217728   Bin:     1000000000000000000000000000
    > Hex: 0x10000000   Dec:  268435456   Bin:    10000000000000000000000000000
    > Hex: 0x20000000   Dec:  536870912   Bin:   100000000000000000000000000000
    > Hex: 0x40000000   Dec: 1073741824   Bin:  1000000000000000000000000000000
    > Hex: 0x80000000   Dec: 2147483648   Bin: 10000000000000000000000000000000
    Alles anzeigen
    AutoIt
    MsgBox(0, "", "16112015 = " & _TranslateBase(16112015))
    
    
    
    
    
    
    For $i = 0 To 31
    	ConsoleWrite("> " & StringFormat("Hex: % 10s   Dec: % 10s   Bin: % 32s", "0x" & StringRegExpReplace(Hex(Int(2 ^ $i)), "^0+([^0]|0$)", "\1", 1), 2 ^ $i, _TranslateBase(2 ^ $i)) & @CRLF)
    Next
    
    
    
    
    Func _TranslateBase($sNumber, $iOldBase = 10, $iNewBase = 2)
    	;by eukalyptus
    	If $iOldBase < 2 Or $iOldBase > 128 Or $iNewBase < 2 Or $iNewBase > 128 Then Return SetError(1, 1, False)
    	Local $iNum, $aRes, $tChr = DllStructCreate("char[65];")
    	If $iOldBase <> 10 Then
    		$aRes = DllCall("msvcrt.dll", "uint64:cdecl", "_strtoui64", "str", $sNumber, "ptr", 0, "int", $iOldBase)
    		If @error Then Return SetError(1, 2, False)
    		$iNum = $aRes[0]
    	Else
    		$iNum = Int($sNumber)
    	EndIf
    	$aRes = DllCall("msvcrt.dll", "ptr:cdecl", "_i64toa", "int64", $iNum, "ptr", DllStructGetPtr($tChr), "int", $iNewBase)
    	If @error Then Return SetError(1, 3, False)
    	Return DllStructGetData($tChr, 1)
    EndFunc   ;==>_TranslateBase
    Alles anzeigen
  • Rückrechnung

    • eukalyptus
    • 15. November 2015 um 20:38

    Du könntest das so machen:

    AutoIt
    Global $aArray[22][2] = [[0, "täglich"], [0x1, "mo"], [0x2, "di"], [0x4, "mi"], [0x8, "do"], [0x10, "fr"], [0x20, "sa"], [0x40, "so"], [0x80, "wöchentlich"], [0x100, "1.WO"], [0x200, "2.WO"], [0x400, "3.WO"], [0x800, "4.WO"], [0x1000, "5.WO"], [0x2000, "gerade WO"], [0x4000, "ungerade WO"], [0x8000, "monatlich"], [0x10000, "monatlich gerade"], [0x20000, "monatlich ungerade"], [0x40000, "nix"], [0x80000, "viertteljaehrlich"], [0x100000, "jaehrlich"]]
    
    
    $iX = 35338
    For $i = 0 To UBound($aArray) - 1
    	If BitAND($iX, $aArray[$i][0]) Then ConsoleWrite($aArray[$i][1] & @CRLF)
    Next
  • Rückrechnung

    • eukalyptus
    • 15. November 2015 um 19:47

    Evtl ist es besser verständlich, wenn du selber siehst, welche Bits gesetzt sind.
    Dazu hätte ich eine Funktion im Angebot:

    AutoIt
    For $i = 0 To 16
    	ConsoleWrite("> " & StringFormat("%032s", _TranslateBase(2 ^ $i)) & " = " & 2 ^ $i & @CRLF)
    Next
    
    
    
    
    Func _TranslateBase($sNumber, $iOldBase = 10, $iNewBase = 2)
    	;by eukalyptus
    	If $iOldBase < 2 Or $iOldBase > 128 Or $iNewBase < 2 Or $iNewBase > 128 Then Return SetError(1, 1, False)
    	Local $iNum, $aRes, $tChr = DllStructCreate("char[65];")
    	If $iOldBase <> 10 Then
    		$aRes = DllCall("msvcrt.dll", "uint64:cdecl", "_strtoui64", "str", $sNumber, "ptr", 0, "int", $iOldBase)
    		If @error Then Return SetError(1, 2, False)
    		$iNum = $aRes[0]
    	Else
    		$iNum = Int($sNumber)
    	EndIf
    	$aRes = DllCall("msvcrt.dll", "ptr:cdecl", "_i64toa", "int64", $iNum, "ptr", DllStructGetPtr($tChr), "int", $iNewBase)
    	If @error Then Return SetError(1, 3, False)
    	Return DllStructGetData($tChr, 1)
    EndFunc   ;==>_TranslateBase
    Alles anzeigen

    lgE

  • ASM-Tricks

    • eukalyptus
    • 15. November 2015 um 19:35

    Teil4

  • ASM-Tricks

    • eukalyptus
    • 15. November 2015 um 19:35

    Teil3

  • ASM-Tricks

    • eukalyptus
    • 15. November 2015 um 19:26

    Integer Division

    Zuerst noch ganz kurz Multiplikation:
    Man sollte prüfen, ob sich eine Multiplikation in mehrere Shifts zerlegen lässt.

    Shift_Left_X entspricht 2^x
    shl 1 = *2
    shl 2 = *4
    shl 3 = *8
    usw...

    z.B.: X*10 = (X*2) + (X*8)

    AutoIt
    ;#include "FASM.au3"
    #AutoIt3Wrapper_UseX64=n
    
    
    ;Global $pASM_Test = _FASM_StructCreateBCA16(_FASM_Compile("_ASM_Test_32"))
    Global $pASM_Test = _StructCreateBCA16("0x8B44240489C2C1E003D1E201D0C20400")
    
    
    
    
    #ASM _ASM_Test_32
    #	use32
    
    
    #	mov eax, [esp+4]
    
    
    #	mov edx, eax
    #	shl eax, 3
    #	shl edx, 1
    #	add eax, edx
    
    
    #	ret 4
    #ASMEND
    
    
    
    
    
    
    
    
    For $i = 0 To 100
    	ConsoleWrite("> " & $i & " * 10 = " & DllCallAddress("int", $pASM_Test, "int", $i)[0] & @CRLF)
    Next
    
    
    
    
    Func _StructCreateBCA16($bBinaryCode)
    	Local $iSize = BinaryLen($bBinaryCode)
    	Local $aResult = DllCall("kernel32.dll", "ptr", "VirtualAlloc", "ptr", 0, "ulong_ptr", $iSize + 16, "dword", 0x00001000, "dword", 0x00000040)
    	If @error Or Not $aResult[0] Then Return SetError(1, 0, False)
    	Local $pStruct = Number($aResult[0])
    	$pStruct = $pStruct + 16 - Mod($pStruct, 16)
    	Local $tStruct = DllStructCreate("byte[" & $iSize & "];", $pStruct)
    	DllStructSetData($tStruct, 1, $bBinaryCode)
    	Return $pStruct
    EndFunc   ;==>_FASM_StructCreateBCA16
    Alles anzeigen


    Wie Minx sehr schön gezeigt hat, kann man eine Division durch eine Multiplikation mit einer Konstanten erreichen.
    Ich habe dazu mein Helper-Script etwas grafisch aufgemotzt:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiSlider.au3>
    #include <WinAPIShellEx.au3>
    #include <GuiRichEdit.au3>
    
    
    
    
    #AutoIt3Wrapper_UseX64=n
    Global $pASM_BinFrac = _StructCreateBCA16("0x5356578B7424108B4C24148B7C24188B5C241C83EC08890C24802E3083C60183E9017FF5897424048B0C248B74240430E48A06D0E000E030E43C0A7C04B4012C0A880683EE0183E9017DE680C430882783C70183EB017FD083C4085F5E5BC21000")
    Global $pASM_BinInt = _StructCreateBCA16("0x5356578B7424108B4C24148B7C241883EC08890C2489742404802E3083C60183E9017FF5BB4000000083C7408B0C248B7424046631D28A06666BD20A00D066BA010020C2D0E8880683C60183E9017FE680C23083EF01881783EB017FCF83C4085F5E5BC20C00")
    Global $pASM_Inv = _StructCreateBCA16("0x5356578B7C24108B7424148B5424188B4C241C8B44242083EC10890C2489742404895424088944240C802A3083C20183E9017FF5C606018B0C248B7424048B5424088A063A027F0F7C4483C60183C20183E9017FEDEB58C607318B0C248B7424048B54240801CE01CA30DB30E483EE0183EA018A062A0228E0881E30E43C007D04B401040288C383E9017FE1EB17C607308B0C248B7424048A4601880683C60183E9017FF383C701836C240C017F8883C4105F5E5BC21400")
    Global $pASM_InvDec = _StructCreateBCA16("0x5356578B7C24108B7424148B4C241883EC08890C24897C240489CB802E3083C60183E9017FF583EE018B0C248B7C24048A0600076631D28A07666BD20A00D066BA010020C2D0E8880783C70183E9017DE683EB017FD08B4C24248B7C240401CF83C701B800000000803F057C21B801000000B70183EF018A1F00FB30FF80FB0A7C0580EB0AB701881F83E9017DE68B0C248B7C240480073083C70183E9017DF58B7C2404C6072E83C4085F5E5BC21000")
    
    
    Global $pASM_Test_M1_I = _StructCreateBCA16("0x535657558B6C24148B5C24188B4C241C8B742420660F6E742424660F6E7C242883EC08660F7E3424660F7E7C2404BFC00FFC0089F031D2F7F5660F6EF089F0F7E3D3EA660F7EF039D0750583EF017F24660F7EFF5183EC0C8944240889542404893424FFD75983F8007418660F6EFFBFC00FFC0083C6013B342475B7B800000000EB05B80100000083C4085D5F5E5BC21800")
    Global $pASM_Test_M1_F = _StructCreateBCA16("0x535657F30F7E4C24108B5C24188B4C241C8B742420660F6E742424660F6E7C2428B800003043660F6ED0660F73FA0483EC10660F7E3424660F7E7C24040FAE5C24088B4424086625FF9F660D00208944240C0FAE54240CBFC00FFC00660F6EC6660FEBC2F20F5CC2F20F5EC1F20F58C2660FEFC289F0F7E3D3EA660F7EC039D0750583EF017F40660F7EFF5183EC10660FD61424660FD64C240883EC0C8944240889542404893424FFD7F30F7E4C2408F30F7E142483C4105983F8007418660F6EFFBFC00FFC0083C6013B3424758DB800000000EB05B8010000000FAE54240883C4105F5E5BC21C00")
    Global $pASM_Test_M2_I = _StructCreateBCA16("0x535657558B6C24148B5C24188B4C241C8B742420660F6E742424660F6E7C242883EC08660F7E3424660F7E7C2404BFC00FFC0089F031D2F7F5660F6EF089F0F7E301F2D3EA660F7EF039D0750583EF017F24660F7EFF5183EC0C8944240889542404893424FFD75983F8007418660F6EFFBFC00FFC0083C6013B342475B5B800000000EB05B80100000083C4085D5F5E5BC21800")
    Global $pASM_Test_M2_F = _StructCreateBCA16("0x535657F30F7E4C24108B5C24188B4C241C8B742420660F6E742424660F6E7C2428B800003043660F6ED0660F73FA0483EC10660F7E3424660F7E7C24040FAE5C24088B4424086625FF9F660D00208944240C0FAE54240CBFC00FFC00660F6EC6660FEBC2F20F5CC2F20F5EC1F20F58C2660FEFC289F0F7E301F2D3EA660F7EC039D0750583EF017F40660F7EFF5183EC10660FD61424660FD64C240883EC0C8944240889542404893424FFD7F30F7E4C2408F30F7E142483C4105983F8007418660F6EFFBFC00FFC0083C6013B3424758BB800000000EB05B8010000000FAE54240883C4105F5E5BC21C00")
    Global $pASM_Test_M3_I = _StructCreateBCA16("0x535657558B6C24148B5C24188B4C241C8B742420660F6E742424660F6E7C242883EC08660F7E3424660F7E7C2404BFC00FFC0089F031D2F7F5660F6EF089F0F7E331C001F283D000C1C804D3EA01C2660F7EF039D0750583EF017F24660F7EFF5183EC0C8944240889542404893424FFD75983F8007418660F6EFFBFC00FFC0083C6013B342475ABB800000000EB05B80100000083C4085D5F5E5BC21800")
    Global $pASM_Test_M3_F = _StructCreateBCA16("0x535657F30F7E4C24108B5C24188B4C241C8B742420660F6E742424660F6E7C2428B800003043660F6ED0660F73FA0483EC10660F7E3424660F7E7C24040FAE5C24088B4424086625FF9F660D00208944240C0FAE54240CBFC00FFC00660F6EC6660FEBC2F20F5CC2F20F5EC1F20F58C2660FEFC289F0F7E331C001F283D000C1C804D3EA01C2660F7EC039D0750583EF017F40660F7EFF5183EC10660FD61424660FD64C240883EC0C8944240889542404893424FFD7F30F7E4C2408F30F7E142483C4105983F8007418660F6EFFBFC00FFC0083C6013B34247581B800000000EB05B8010000000FAE54240883C4105F5E5BC21C00")
    
    
    
    
    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)
    
    
    Global $iWidth = 800
    Global $iHeight = 740
    
    
    Global $hGui = GUICreate("MagicDiv by Eukalyptus", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    
    
    GUICtrlCreateLabel("Divisor:", 10, 13, 80, 20, BitOR(0x0002, 0x0200))
    Global $cIP_DivI = GUICtrlCreateInput("10", 100, 10, 100, 26, BitOR(0x0002, 0x2000))
    GUICtrlSetFont(-1, 12)
    GUICtrlCreateLabel(".", 200, 13, 10, 20, BitOR(0x0001, 0x0200))
    GUICtrlSetFont(-1, 12, 400, 0, "Lucida Console")
    Global $cIP_DivF = GUICtrlCreateInput("0", 210, 10, 120, 26, 0x2000)
    GUICtrlSetFont(-1, 12)
    GUICtrlSetState(-1, $GUI_DISABLE)
    
    
    Global $cCB_Frac = GUICtrlCreateCheckbox("Enable Fractional", 360, 13, 120, 20)
    GUICtrlSetOnEvent(-1, "_EnableFrac")
    
    
    GUICtrlCreateLabel("MagicNumber-Offset:", 500, 13, 120, 20, BitOR(0x0002, 0x0200))
    Global $cIP_Offset = GUICtrlCreateInput("0", 630, 10, 60, 26, BitOR(0x0002, 0x2000, 0x0800))
    GUICtrlSetFont(-1, 12)
    GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 100, -100)
    GUICtrlSetOnEvent(-1, "_SetOffset")
    
    
    
    
    
    
    GUICtrlCreateLabel("Inverse Bin:", 10, 50, 70, 20, BitOR(0x0002, 0x0200))
    GUICtrlCreateLabel("0.", 90, 50, 10, 20, BitOR(0x0002, 0x0200))
    Global $cIP_InvB = GUICtrlCreateInput("", 100, 50, $iWidth - 120, 20, 0x0800)
    GUICtrlCreateLabel("Inverse Dec:", 10, 80, 70, 20, BitOR(0x0002, 0x0200))
    GUICtrlCreateLabel("0.", 90, 80, 10, 20, BitOR(0x0002, 0x0200))
    Global $cIP_InvD = GUICtrlCreateInput("", 100, 80, $iWidth - 120, 20, 0x0800)
    
    
    Global $aET_ASM[3][3]
    Global $iTmpW = ($iWidth - 110) * 0.5
    Global $iTmpY = 120, $iTmpH = 100
    For $y = 0 To 2
    	$iTmpH += 27 * $y
    	GUICtrlCreateLabel("ASM X86  Method  " & $y + 1 & "   (result in edx)", 100, $iTmpY, $iTmpW - 10, 15)
    	GUICtrlSetFont(-1, 8)
    	GUICtrlCreateLabel("ASM X64  Method  " & $y + 1 & "   (result in rdx)", 100 + $iTmpW, $iTmpY, $iTmpW - 10, 15)
    	GUICtrlSetFont(-1, 8)
    	$aET_ASM[$y][0] = GUICtrlCreateEdit("", 100, $iTmpY + 15, $iTmpW - 10, $iTmpH - 30, 0x0800)
    	GUICtrlSetFont(-1, 10, 400, 0, "Lucida Console")
    	GUICtrlSetColor(-1, 0x0000FF)
    	$aET_ASM[$y][1] = GUICtrlCreateEdit("", 100 + $iTmpW, $iTmpY + 15, $iTmpW - 10, $iTmpH - 30, 0x0800)
    	GUICtrlSetFont(-1, 10, 400, 0, "Lucida Console")
    	GUICtrlSetColor(-1, 0x0000FF)
    	$aET_ASM[$y][2] = GUICtrlCreateButton("TEST", 10, $iTmpY + 15, 80, 25)
    	GUICtrlSetOnEvent(-1, "_Test")
    	$iTmpY += $iTmpH
    Next
    
    
    GUICtrlCreateGroup("TEST", 10, $iTmpY, $iWidth - 20, $iHeight - $iTmpY - 10)
    GUICtrlCreateLabel("Range:", 20, $iTmpY + 20, 70, 50, BitOR(0x0002, 0x0200))
    
    
    GUICtrlCreateLabel("0x00000000", 110, $iTmpY + 10, 100, 10, 0x0200)
    GUICtrlSetFont(-1, 7)
    GUICtrlCreateLabel("0xFFFFFFFF", $iWidth - 130, $iTmpY + 10, 100, 10, BitOR(0x0002, 0x0200))
    GUICtrlSetFont(-1, 7)
    
    
    Global $cSL_Range = GUICtrlCreateSlider(100, $iTmpY + 20, $iWidth - 120, 30, BitOR(0x0080, 0x0004, 0x20, 0x40))
    GUICtrlSetLimit(-1, 1000)
    _GUICtrlSlider_SetSelEnd($cSL_Range, 1000)
    
    
    
    
    OnAutoItExitRegister("OnAutoItExit")
    Global $hSubClass = DllCallbackRegister("_Subclass", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr")
    Global $pSubClass = DllCallbackGetPtr($hSubClass)
    _WinAPI_SetWindowSubclass(GUICtrlGetHandle($cSL_Range), $pSubClass, 1000, 0)
    
    
    
    
    Global $cIP_RangeLO = GUICtrlCreateInput("0", 110, $iTmpY + 55, 80, 20, BitOR(0x0002, 0x2000))
    GUICtrlSetOnEvent(-1, "_SetRange")
    GUICtrlCreateLabel("...", 190, $iTmpY + 55, 25, 20, BitOR(0x0001, 0x0200))
    GUICtrlSetFont(-1, 8, 400, 0, "Lucida Console")
    Global $cIP_RangeHI = GUICtrlCreateInput("4294967295", 215, $iTmpY + 55, 80, 20, BitOR(0x0002, 0x2000))
    GUICtrlSetOnEvent(-1, "_SetRange")
    
    
    
    
    GUICtrlCreateLabel("Max Errors:", 300, $iTmpY + 55, 100, 20, BitOR(0x0002, 0x0200))
    Global $cIP_MaxError = GUICtrlCreateInput("10", 410, $iTmpY + 55, 60, 20, BitOR(0x0002, 0x2000, 0x0800))
    GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 999, 1)
    GUICtrlSetOnEvent(-1, "_SetMaxError")
    
    
    
    
    Global $cIP_Info = GUICtrlCreateInput("", $iWidth - 190, $iTmpY + 55, 160, 20, BitOR(0x0002, 0x0800))
    GUICtrlSetFont(-1, 11, 400, 0, "Lucida Console")
    
    
    Global $cCB_Stop = GUICtrlCreateCheckbox("Stop", 520, $iTmpY + 55, 60, 20, 0x1000)
    
    
    $iTmpY += 85
    Global $cRE_Info = _GUICtrlRichEdit_Create($hGui, "", 20, $iTmpY, $iWidth - 40, $iHeight - $iTmpY - 20, BitOR($ES_WANTRETURN, $ES_MULTILINE, $WS_VSCROLL))
    
    
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    GUISetState()
    
    
    
    
    
    
    Global $hCallBack = DllCallbackRegister("_CB_Progress", "uint", "uint;uint;uint;")
    
    
    
    
    Global $iErrorCnt = 0, $iErrorMax = 10
    Global $iMDiv32, $iMDiv33, $iMShft, $fDiv
    Global $bCalcMagic = False
    Global $bCalcInv = True
    
    
    
    
    
    
    While Sleep(10)
    	If $bCalcInv Then
    		$bCalcInv = False
    		_CalcInv()
    	EndIf
    	If $bCalcMagic Then
    		$bCalcMagic = False
    		_CalcMagic()
    	EndIf
    WEnd
    
    
    
    
    
    
    
    
    Func _SetOffset()
    	$bCalcMagic = True
    EndFunc   ;==>_SetOffset
    
    
    
    
    
    
    Func _SetMaxError()
    	$iErrorMax = Int(GUICtrlRead($cIP_MaxError))
    EndFunc   ;==>_SetMaxError
    
    
    
    
    
    
    Func _Info($sText, $iColor, $bBold = False, $iSize = 10)
    	Local $iPos = StringLen(_GUICtrlRichEdit_GetText($cRE_Info))
    
    
    	_GUICtrlRichEdit_AppendText($cRE_Info, $sText)
    	_GUICtrlRichEdit_SetSel($cRE_Info, $iPos, -1)
    
    
    	Local $tCharFormat = DllStructCreate("struct; uint cbSize; dword dwMask; dword dwEffects; long yHeight; long yOffset; INT crCharColor; byte bCharSet; byte bPitchAndFamily; wchar szFaceName[32]; endstruct")
    	DllStructSetData($tCharFormat, 1, DllStructGetSize($tCharFormat))
    	DllStructSetData($tCharFormat, 2, BitOR($CFM_BOLD, $CFM_COLOR, $CFM_FACE, $CFM_SIZE))
    	If $bBold Then DllStructSetData($tCharFormat, 3, $CFE_BOLD)
    
    
    	DllStructSetData($tCharFormat, 4, Int($iSize * 20))
    	DllStructSetData($tCharFormat, 6, $iColor)
    	DllStructSetData($tCharFormat, 9, "Lucida Console")
    
    
    	_SendMessage($cRE_Info, $EM_SETCHARFORMAT, $SCF_SELECTION, $tCharFormat, 0, "wparam", "struct*")
    
    
    	_GUICtrlRichEdit_Deselect($cRE_Info)
    EndFunc   ;==>_Info
    
    
    
    
    
    
    
    
    Func _Test()
    	$iErrorCnt = 0
    
    
    	Local $iMethod, $bFrac = False
    	For $i = 0 To 2
    		If @GUI_CtrlId = $aET_ASM[$i][2] Then $iMethod = $i + 1
    	Next
    
    
    	Local $sMethod = String($iMethod)
    	$fDiv = GUICtrlRead($cIP_DivI)
    	If GUICtrlRead($cCB_Frac) = 1 Then
    		$fDiv &= "." & GUICtrlRead($cIP_DivF)
    		$sMethod &= " Fractional"
    		$bFrac = True
    	Else
    		$sMethod &= " Integer"
    	EndIf
    
    
    	Local $iRangeLO = GUICtrlRead($cIP_RangeLO)
    	Local $iRangeHI = GUICtrlRead($cIP_RangeHI)
    	GUICtrlSetData($cSL_Range, $iRangeLO / 4294967.296)
    	GUICtrlSetStyle($cSL_Range, BitOR(0x0004, 0x20, 0x40))
    
    
    	GUICtrlSetState($cCB_Stop, $GUI_UNCHECKED)
    
    
    	GUICtrlSetState($cSL_Range, $GUI_DISABLE)
    
    
    	_GUICtrlRichEdit_SetText($cRE_Info, "")
    	_Info("Testing MagicDiv" & @CRLF, 0xAA0000, True, 12)
    	_Info("Method " & $sMethod & @CRLF, 0xAA0000)
    	_Info("Dividend = ", 0xAA0000)
    	_Info("[" & $iRangeLO & "..." & $iRangeHI & "]" & @CRLF, 0x008800)
    	_Info("Divisor = ", 0xAA0000)
    	_Info($fDiv & @CRLF & @CRLF, 0x008800, True)
    
    
    	Local $aResult
    	Switch $iMethod
    		Case 1
    			Switch $bFrac
    				Case True
    					$aResult = DllCallAddress("uint", $pASM_Test_M1_F, "double", $fDiv, "uint", $iMDiv32, "uint", $iMShft, "uint", $iRangeLO, "uint", $iRangeHI + 1, "ptr", DllCallbackGetPtr($hCallBack))
    				Case Else
    					$aResult = DllCallAddress("uint", $pASM_Test_M1_I, "uint", $fDiv, "uint", $iMDiv32, "uint", $iMShft, "uint", $iRangeLO, "uint", $iRangeHI + 1, "ptr", DllCallbackGetPtr($hCallBack))
    			EndSwitch
    
    
    		Case 2
    			Switch $bFrac
    				Case True
    					$aResult = DllCallAddress("uint", $pASM_Test_M2_F, "double", $fDiv, "uint", $iMDiv33, "uint", $iMShft+1, "uint", $iRangeLO, "uint", $iRangeHI + 1, "ptr", DllCallbackGetPtr($hCallBack))
    				Case Else
    					$aResult = DllCallAddress("uint", $pASM_Test_M2_I, "uint", $fDiv, "uint", $iMDiv33, "uint", $iMShft+1, "uint", $iRangeLO, "uint", $iRangeHI + 1, "ptr", DllCallbackGetPtr($hCallBack))
    			EndSwitch
    
    
    		Case 3
    			Switch $bFrac
    				Case True
    					$aResult = DllCallAddress("uint", $pASM_Test_M3_F, "double", $fDiv, "uint", $iMDiv33, "uint", $iMShft+1, "uint", $iRangeLO, "uint", $iRangeHI + 1, "ptr", DllCallbackGetPtr($hCallBack))
    				Case Else
    					$aResult = DllCallAddress("uint", $pASM_Test_M3_I, "uint", $fDiv, "uint", $iMDiv33, "uint", $iMShft+1, "uint", $iRangeLO, "uint", $iRangeHI + 1, "ptr", DllCallbackGetPtr($hCallBack))
    			EndSwitch
    
    
    	EndSwitch
    
    
    	GUICtrlSetState($cSL_Range, $GUI_ENABLE)
    	GUICtrlSetStyle($cSL_Range, BitOR(0x0080, 0x0004, 0x20, 0x40))
    
    
    	If $iErrorCnt = 0 And $aResult[0] = 0 Then
    		_Info("...OK..." & @CRLF, 0x008800, True, 12)
    		GUICtrlSetData($cIP_Info, "100%   0x" & Hex($iRangeHI, 8))
    	Else
    		_Info("...Error or Stop..." & @CRLF, 0xFF, True, 12)
    	EndIf
    
    
    	GUICtrlSetState($cCB_Stop, $GUI_UNCHECKED)
    	_GUICtrlRichEdit_SetSel($cRE_Info, 0, 0)
    EndFunc   ;==>_Test
    
    
    
    
    
    
    
    
    
    
    Func _CB_Progress($iX, $iMDiv, $iDiv)
    	If GUICtrlRead($cCB_Stop) = 1 Then Return False
    
    
    	GUICtrlSetData($cSL_Range, $iX / 4294967.296)
    
    
    	Local $iRangeLO = GUICtrlRead($cIP_RangeLO)
    	Local $iRangeHI = GUICtrlRead($cIP_RangeHI)
    	Local $iPerc = ($iX - $iRangeLO) / ($iRangeHI - $iRangeLO) * 100
    	GUICtrlSetData($cIP_Info, Floor($iPerc) & "%   0x" & Hex($iX, 8))
    
    
    	If $iDiv <> $iMDiv Then
    		$iErrorCnt += 1
    		_Info("Error " & $iErrorCnt & "/" & $iErrorMax & " at number ", 0xFF)
    		_Info("0x" & Hex($iX, 8) & " => " & $iX & " / " & $fDiv & " = " & $iX / $fDiv & " (AutoIt)" & @CRLF, 0xAA0000)
    		_Info(@TAB & "Result ASM: ", 0xAA0000)
    		_Info($iDiv & " ", 0x008800)
    		_Info(@TAB & "Result MagicDiv: ", 0xAA0000)
    		_Info($iMDiv & @CRLF & @CRLF, 0xFF)
    	EndIf
    
    
    	Return $iErrorCnt < $iErrorMax
    EndFunc   ;==>_CB_Progress
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    Func _SetRange()
    	Local $iRange = Number(GUICtrlRead(@GUI_CtrlId))
    	Switch @GUI_CtrlId
    		Case $cIP_RangeLO
    			If $iRange > Number(GUICtrlRead($cIP_RangeHI)) Then
    				$iRange = Number(GUICtrlRead($cIP_RangeHI))
    			ElseIf $iRange < 0 Then
    				$iRange = 0
    			EndIf
    			GUICtrlSetData(@GUI_CtrlId, $iRange)
    			_GUICtrlSlider_SetSelStart($cSL_Range, $iRange * 1000 / 4294967295)
    			_GUICtrlSlider_SetSelEnd($cSL_Range, Number(GUICtrlRead($cIP_RangeHI)) * 1000 / 4294967295)
    
    
    		Case $cIP_RangeHI
    			If $iRange < Number(GUICtrlRead($cIP_RangeLO)) Then
    				$iRange = Number(GUICtrlRead($cIP_RangeLO))
    			ElseIf $iRange > 4294967295 Then
    				$iRange = 4294967295
    			EndIf
    			GUICtrlSetData(@GUI_CtrlId, $iRange)
    			_GUICtrlSlider_SetSelStart($cSL_Range, Number(GUICtrlRead($cIP_RangeLO)) * 1000 / 4294967295)
    			_GUICtrlSlider_SetSelEnd($cSL_Range, $iRange * 1000 / 4294967295)
    
    
    	EndSwitch
    EndFunc   ;==>_SetRange
    
    
    
    
    
    
    
    
    Func _Subclass($hWnd, $iMsg, $wParam, $lParam, $iID, $pData)
    	Local Static $iSetRange = 0
    
    
    	Switch $iMsg
    		Case $WM_LBUTTONDOWN
    			Local $tRect = _GUICtrlSlider_GetChannelRectEx($hWnd)
    			Local $iW = DllStructGetData($tRect, "Right") - DllStructGetData($tRect, "Left")
    			Local $iX = BitAND($lParam, 0xFFFF) - DllStructGetData($tRect, "Left")
    			Local $iRange = Round($iX / $iW * 4294967295)
    			If $iRange < 0 Then
    				$iRange = 0
    			ElseIf $iRange > 4294967295 Then
    				$iRange = 4294967295
    			EndIf
    
    
    			Local $aRange = _GUICtrlSlider_GetSel($hWnd)
    			If IsArray($aRange) Then
    				$aRange[0] *= $iW / 1000
    				$aRange[1] *= $iW / 1000
    
    
    				Local $iD1 = Abs($aRange[0] - $iX)
    				Local $iD2 = Abs($aRange[1] - $iX)
    
    
    				If $iD1 < $iD2 Then
    					$iSetRange = 1
    				ElseIf $iD1 > $iD2 Then
    					$iSetRange = 2
    				Else
    					If $iX < $aRange[0] Then
    						$iSetRange = 1
    					Else
    						$iSetRange = 2
    					EndIf
    				EndIf
    			Else
    				$iSetRange = 0
    			EndIf
    
    
    			Switch $iSetRange
    				Case 1
    					_GUICtrlSlider_SetSelStart($hWnd, $iRange / 4294967295 * 1000)
    					GUICtrlSetData($cIP_RangeLO, $iRange)
    				Case 2
    					_GUICtrlSlider_SetSelEnd($hWnd, $iRange / 4294967295 * 1000)
    					GUICtrlSetData($cIP_RangeHI, $iRange)
    			EndSwitch
    
    
    
    
    
    
    
    
    		Case $WM_MOUSELEAVE
    			;$iSetRange = 0
    
    
    		Case $WM_LBUTTONUP
    			$iSetRange = 0
    
    
    		Case $WM_MOUSEMOVE
    			If $wParam = 1 And $iSetRange <> 0 Then
    				Local $tRect = _GUICtrlSlider_GetChannelRectEx($hWnd)
    				Local $iW = DllStructGetData($tRect, "Right") - DllStructGetData($tRect, "Left")
    				Local $iX = BitAND($lParam, 0xFFFF) - DllStructGetData($tRect, "Left")
    				Local $iRange = Round($iX / $iW * 4294967295)
    				If $iRange < 0 Then
    					$iRange = 0
    				ElseIf $iRange > 4294967295 Then
    					$iRange = 4294967295
    				EndIf
    
    
    				Switch $iSetRange
    					Case 1
    						If $iRange > Number(GUICtrlRead($cIP_RangeHI)) Then $iRange = Number(GUICtrlRead($cIP_RangeHI))
    						_GUICtrlSlider_SetSelStart($hWnd, $iRange / 4294967295 * 1000)
    						GUICtrlSetData($cIP_RangeLO, $iRange)
    
    
    					Case 2
    						If $iRange < Number(GUICtrlRead($cIP_RangeLO)) Then $iRange = Number(GUICtrlRead($cIP_RangeLO))
    						_GUICtrlSlider_SetSelEnd($hWnd, $iRange / 4294967295 * 1000)
    						GUICtrlSetData($cIP_RangeHI, $iRange)
    
    
    				EndSwitch
    
    
    			EndIf
    
    
    	EndSwitch
    
    
    	Return _WinAPI_DefSubclassProc($hWnd, $iMsg, $wParam, $lParam)
    EndFunc   ;==>_Subclass
    
    
    
    
    Func OnAutoItExit()
    	_WinAPI_RemoveWindowSubclass(GUICtrlGetHandle($cSL_Range), $pSubClass, 1000)
    	DllCallbackFree($pSubClass)
    	DllCallbackFree($hCallBack)
    EndFunc   ;==>OnAutoItExit
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    	Local $iNotifyCode = BitShift($wParam, 16)
    	Local $iCtrlID = BitAND($wParam, 0xFFFF)
    
    
    	Switch $iNotifyCode
    		Case 0x300 ;EN_CHANGE
    			Switch $iCtrlID
    				Case $cIP_DivI, $cIP_DivF
    					$bCalcInv = True
    
    
    			EndSwitch
    
    
    		Case Else
    			;ConsoleWrite("! " & $hWnd & " " & $iMsg & " " & $wParam & " " & $lParam & "     " & $iNotifyCode & " " & $iCtrlID & " " & $lParam & @CRLF)
    
    
    	EndSwitch
    
    
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_COMMAND
    
    
    
    
    
    
    
    
    Func _CalcMagic()
    	Local $sTmp = __BinFrac(GUICtrlRead($cIP_InvD))
    	Local $sBin = StringRegExpReplace($sTmp, "^0+([^0]|0$)", "\1", 1)
    	Local $iShift = StringLen($sTmp) - StringLen($sBin)
    
    
    	Local $iOffset = Int(GUICtrlRead($cIP_Offset))
    
    
    	Local $sDiv64 = Dec(StringFormat("%016s", StringUpper(_TranslateBase(StringLeft(__FracAdd(StringLeft($sBin, 65)), 64), 2, 16)))) + $iOffset
    	Local $sDiv32 = Dec(StringFormat("%08s", StringUpper(_TranslateBase(StringLeft(__FracAdd(StringLeft($sBin, 33)), 32), 2, 16)))) + $iOffset
    	Local $sDiv65 = Dec(StringFormat("%016s", StringUpper(_TranslateBase(StringTrimLeft(StringLeft(__FracAdd(StringLeft($sBin, 65)), 66), 1), 2, 16)))) + $iOffset
    	Local $sDiv33 = Dec(StringFormat("%08s", StringUpper(_TranslateBase(StringTrimLeft(StringLeft(__FracAdd(StringLeft($sBin, 34)), 33), 1), 2, 16)))) + $iOffset
    
    
    
    
    	Local $sASM = "mov eax, [dividend]" & @CRLF & "mov ecx, 0x" & Hex($sDiv32, 8) & @CRLF & "mul ecx" & @CRLF
    	If $iShift Then $sASM &= "shr edx, " & $iShift & @CRLF
    	GUICtrlSetData($aET_ASM[0][0], $sASM)
    
    
    	$sASM = "mov rax, [dividend]" & @CRLF & "mov rcx, 0x" & Hex($sDiv64, 16) & @CRLF & "mul rcx" & @CRLF
    	If $iShift Then $sASM &= "shr rdx, " & $iShift & @CRLF
    	GUICtrlSetData($aET_ASM[0][1], $sASM)
    
    
    	$sASM = "mov eax, [dividend]" & @CRLF & "mov ebx, eax" & @CRLF & "mov ecx, 0x" & Hex($sDiv33, 8) & @CRLF & "mul ecx" & @CRLF & "add edx, ebx" & @CRLF
    	If $iShift Then $sASM &= "shr edx, " & $iShift + 1 & @CRLF
    	GUICtrlSetData($aET_ASM[1][0], $sASM)
    
    
    	$sASM = "mov rax, [dividend]" & @CRLF & "mov rbx, rax" & @CRLF & "mov rcx, 0x" & Hex($sDiv65, 16) & @CRLF & "mul rcx" & @CRLF & "add rdx, rbx" & @CRLF
    	If $iShift Then $sASM &= "shr rdx, " & $iShift + 1 & @CRLF
    	GUICtrlSetData($aET_ASM[1][1], $sASM)
    
    
    	$sASM = "mov eax, [dividend]" & @CRLF & "mov ebx, eax" & @CRLF & "mov ecx, 0x" & Hex($sDiv33, 8) & @CRLF & "mul ecx" & @CRLF & "xor eax, eax" & @CRLF & "add edx, ebx" & @CRLF & "adc eax, 0" & @CRLF
    	If $iShift Then $sASM &= "ror eax, " & $iShift + 1 & @CRLF & "shr edx, " & $iShift + 1 & @CRLF
    	$sASM &= "add edx, eax"
    	GUICtrlSetData($aET_ASM[2][0], $sASM)
    
    
    	$sASM = "mov rax, [dividend]" & @CRLF & "mov rbx, rax" & @CRLF & "mov rcx, 0x" & Hex($sDiv65, 16) & @CRLF & "mul rcx" & @CRLF & "xor rax, rax" & @CRLF & "add rdx, rbx" & @CRLF & "adc rax, 0" & @CRLF
    	If $iShift Then $sASM &= "ror rax, " & $iShift + 1 & @CRLF & "shr rdx, " & $iShift + 1 & @CRLF
    	$sASM &= "add rdx, rax"
    	GUICtrlSetData($aET_ASM[2][1], $sASM)
    
    
    	$iMDiv32 = $sDiv32
    	$iMDiv33 = $sDiv33
    	$iMShft = $iShift
    
    
    EndFunc   ;==>_CalcMagic
    
    
    
    
    
    
    
    
    Func __FracAdd($sBin)
    	Local $aBin = StringRegExp($sBin, "\d", 3)
    
    
    	Local $iCar = 1
    	For $i = UBound($aBin) - 1 To 0 Step -1
    		$aBin[$i] += $iCar
    		If $aBin[$i] > 1 Then
    			$aBin[$i] = 0
    		Else
    			ExitLoop
    		EndIf
    	Next
    
    
    	$sBin = ""
    	For $i = 0 To UBound($aBin) - 1
    		$sBin &= $aBin[$i]
    	Next
    
    
    	Return $sBin
    EndFunc   ;==>__FracAdd
    
    
    
    
    
    
    
    
    Func _CalcInv()
    	Local $sDiv = GUICtrlRead($cIP_DivI)
    	If GUICtrlRead($cCB_Frac) = 1 Then $sDiv &= "." & GUICtrlRead($cIP_DivF)
    	If Number($sDiv) < 2 Then
    		For $i = 0 To 2
    			GUICtrlSetData($aET_ASM[$i][0], "")
    			GUICtrlSetData($aET_ASM[$i][1], "")
    			GUICtrlSetState($aET_ASM[$i][2], $GUI_DISABLE)
    		Next
    		Return
    	EndIf
    	GUICtrlSetState($aET_ASM[0][2], $GUI_ENABLE)
    	GUICtrlSetState($aET_ASM[1][2], $GUI_ENABLE)
    	GUICtrlSetState($aET_ASM[2][2], $GUI_ENABLE)
    
    
    	Local $sInvB = __CalcInv($sDiv)
    	GUICtrlSetData($cIP_InvB, $sInvB)
    
    
    	Local $iRnd
    	Local $sInvD = __InvDec($sInvB, $iRnd)
    	GUICtrlSetData($cIP_InvD, StringTrimLeft($sInvD, 2))
    
    
    	;If $iRnd Then
    	;	GUICtrlSetData($cIP_Offset, 1)
    	;Else
    		GUICtrlSetData($cIP_Offset, 0)
    	;EndIf
    
    
    	$bCalcMagic = True
    
    
    EndFunc   ;==>_CalcInv
    
    
    
    
    
    
    Func _EnableFrac()
    	If GUICtrlRead($cCB_Frac) = 1 Then
    		GUICtrlSetState($cIP_DivF, $GUI_ENABLE)
    	Else
    		GUICtrlSetState($cIP_DivF, $GUI_DISABLE)
    	EndIf
    	$bCalcInv = True
    EndFunc   ;==>_EnableFrac
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    Func _Exit()
    	GUIDelete($hGui)
    	Exit
    EndFunc   ;==>_Exit
    
    
    
    
    
    
    
    
    
    
    Func _TranslateBase($sNumber, $iOldBase = 10, $iNewBase = 2)
    	;by eukalyptus
    	If $iOldBase < 2 Or $iOldBase > 128 Or $iNewBase < 2 Or $iNewBase > 128 Then Return SetError(1, 1, False)
    	Local $iNum, $aRes, $tChr = DllStructCreate("char[65];")
    	If $iOldBase <> 10 Then
    		$aRes = DllCall("msvcrt.dll", "uint64:cdecl", "_strtoui64", "str", $sNumber, "ptr", 0, "int", $iOldBase)
    		If @error Then Return SetError(1, 2, False)
    		$iNum = $aRes[0]
    	Else
    		$iNum = Int($sNumber)
    	EndIf
    	$aRes = DllCall("msvcrt.dll", "ptr:cdecl", "_i64toa", "int64", $iNum, "ptr", DllStructGetPtr($tChr), "int", $iNewBase)
    	If @error Then Return SetError(1, 3, False)
    	Return DllStructGetData($tChr, 1)
    EndFunc   ;==>_TranslateBase
    
    
    
    
    
    
    
    
    
    
    
    
    Func __InvDec($sInv, ByRef $iRnd, $iPrec = 64)
    	Local $iLen = StringLen($sInv)
    	Local $tInv = DllStructCreate("char[" & $iLen & "]; byte[16];")
    	Local $tDec = DllStructCreate("char[" & $iLen + $iPrec + 1 & "]; byte[16];")
    	DllStructSetData($tInv, 1, $sInv)
    
    
    	Local $aResult = DllCallAddress("uint", $pASM_InvDec, "struct*", $tDec, "struct*", $tInv, "uint", $iLen, "uint", $iPrec)
    	$iRnd = $aResult[0] = 1
    	Local $sDec = StringLeft(DllStructGetData($tDec, 1), $iPrec + 1)
    	$sDec = StringRegExpReplace($sDec, "(^0|[^0])0+$", "\1", 1) ;Pst
    
    
    	Return "0" & $sDec
    EndFunc   ;==>__InvDec
    
    
    
    
    
    
    Func __CalcInv($sDec, $iPrec = 64)
    
    
    	$iPrec *= 4
    
    
    	$sDec = StringRegExpReplace($sDec, "[^0-9.]", "")
    	If Not StringInStr($sDec, ".") Then $sDec &= "."
    	Local $sInt = StringRegExpReplace($sDec, "\.\d*", "")
    	Local $sFrac = StringRegExpReplace($sDec, "\d*\.", "")
    
    
    	$sInt = __BinInt($sInt)
    	$sFrac = __BinFrac($sFrac)
    
    
    	Local $sDvs = $sInt & $sFrac
    	Local $iDot = StringLen($sInt)
    	Local $iDvs = StringLen($sDvs)
    	$sDvs = StringRegExpReplace($sDvs, "^0+([^0]|0$)", "\1", 1) ;Pre
    	$iDot -= $iDvs - StringLen($sDvs) + 1
    	$sDvs = StringRegExpReplace($sDvs, "(^0|[^0])0+$", "\1", 1) ;Pst
    	If Not $sDvs Or $sDvs = "0" Then Return SetError(1, 1, False)
    
    
    	Local $sInv = "0"
    	Switch $sDvs
    		Case "1"
    			$sInv = "1"
    			$iDot -= 1
    
    
    		Case Else
    			$sDvs = "0" & $sDvs
    			Local $iLen = StringLen($sDvs)
    			Local $tDvs = DllStructCreate("char[" & $iLen & "]; byte[16];")
    			Local $tDvd = DllStructCreate("char[" & $iLen & "]; byte[16];")
    			Local $tInv = DllStructCreate("char[" & $iPrec & "]; byte[16];")
    			DllStructSetData($tDvs, 1, $sDvs)
    
    
    			DllCallAddress("none", $pASM_Inv, "struct*", $tInv, "struct*", $tDvd, "struct*", $tDvs, "uint", $iLen, "uint", $iPrec)
    
    
    			$sInv = DllStructGetData($tInv, 1)
    
    
    	EndSwitch
    
    
    	Return StringFormat("%0" & $iDot & "s", "") & $sInv
    EndFunc   ;==>__CalcInv
    
    
    
    
    Func __BinInt($sInt)
    	Local $iLen = StringLen($sInt)
    	If $iLen < 1 Then Return "0"
    	Local $tInt = DllStructCreate("char[" & $iLen & "]; byte[16];")
    	Local $tBin = DllStructCreate("char[64]; byte[16];")
    	DllStructSetData($tInt, 1, $sInt)
    
    
    	Local $aResult = DllCallAddress("uint", $pASM_BinInt, "struct*", $tInt, "uint", $iLen, "struct*", $tBin)
    
    
    	Return DllStructGetData($tBin, 1)
    EndFunc   ;==>__BinInt
    
    
    
    
    Func __BinFrac($sFrac, $iPrec = 256)
    	Local $iLen = StringLen($sFrac)
    	If $iLen < 1 Then Return "0"
    	Local $tFrac = DllStructCreate("char[" & $iLen & "]; byte[16];")
    	Local $tBin = DllStructCreate("char[" & $iPrec & "]; byte[16];")
    	DllStructSetData($tFrac, 1, $sFrac)
    
    
    	Local $aResult = DllCallAddress("uint", $pASM_BinFrac, "struct*", $tFrac, "uint", $iLen, "struct*", $tBin, "uint", $iPrec)
    
    
    	Return DllStructGetData($tBin, 1)
    EndFunc   ;==>__BinFrac
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    Func _StructCreateBCA16($bBinaryCode)
    	Local $iSize = BinaryLen($bBinaryCode)
    	Local $aResult = DllCall("kernel32.dll", "ptr", "VirtualAlloc", "ptr", 0, "ulong_ptr", $iSize + 16, "dword", 0x00001000, "dword", 0x00000040)
    	If @error Or Not $aResult[0] Then Return SetError(1, 0, False)
    	Local $pStruct = Number($aResult[0])
    	$pStruct = $pStruct + 16 - Mod($pStruct, 16)
    	Local $tStruct = DllStructCreate("byte[" & $iSize & "];", $pStruct)
    	DllStructSetData($tStruct, 1, $bBinaryCode)
    	Return $pStruct
    EndFunc   ;==>_StructCreateBCA16
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™