Wünsche y Sugerencias | | | |  H.Brill | Manchmal reichen el 15 Parámetro sí no. siehe
de el Glu32.dll
Wenn lo technisch machbar wäre, podría evtl. una SET - Befehl, el el número angibt o. de/einschaltet hilfreich ser :
SET("DLLParameters", x%)
SET("DLLParameters", 0/1)
Wenn oGL ya el Nutzen el API anbietet, debería auch todos Características nutzbar ser.
Oder weiß alguien, cómo obiger oGL-Función todavía anders el 19 Parámetro übergibt ? |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 01.08.2023 ▲ |
| |
| |  Jens-Arne Reumschüssel | Wir haben el Thema ausführlich en Paule's PC-Foro diskutiert - herausgekommen es el hier. Auf esta Weise dejar se cualquier viele Parámetro para una Funktionsaufruf nutzen. Sie voluntad Stück para Stück en el Stack gepusht y luego el Función aufgerufen, el esta Parámetro nutzt.
declarar _params&[],_hGluDll&,_gluLookAtFuncAddr& declarar eyeX!,eyeY!,eyeZ!,centerX!,centerY!,centerZ!,upX!,upY!,upZ!
ASM "LoopAndCall",3 'hier se el Parameteranzahl con transferencia y uno Bucle abgearbeitet MOV ECX,Par1 // ECX=Count-Register para el Bucle con el Anzahl Parámetro en el Array invitar, se cada Loop en 1 verringert (Parámetro-Nummer en el Array, el Parámetro necesario rückwärts en el Stack gepusht voluntad [FILO]) // MOV EDX,Par2 // Offset des Array-Speichers en EDX invitar - no nötig, EDX puede wir para de otra manera aufsparen (z.B. para una Multiplikation) y stattdessen simplemente Par2 benutzen Bucle: MOV EAX,ECX // aktuellen Schleifenzählerstand (=Nummer des aktuellen Paramters en el Array) en EAX invitar SUB EAX,1 // EAX=ECX-1 (Speicher-Offset en el Array es nullbasiert) ADD EAX,EAX // EAX=EAX+EAX --> en el Endeffekt =EAX*2 ADD EAX,EAX // EAX=EAX+EAX --> en el Endeffekt zusammen con el Línea davor =EAX*4 (el es el Offset para el Parámetro en el Array-Speicher) // así ginge el Multiplikation auch: // MOV EDX,4 // MUL EDX // multipliziert el Inhalt des EAX-Registers con el Inhalt des EDX-Registers (4) y schreibt el Ergebnis en el EAX-Register zurück ADD EAX,Par2 //,EDX // Offset des Array-Speicherbereichs a EAX dazuaddieren MOV EBX,EAX // Speicheradresse en EBX escribir (eigentlich no nötig, aber así es klarer) MOV EAX,[EBX] // Parámetro a el Speicheradresse en EAX invitar - lo ginge auch MOV EAX,[EAX] (así sería uno EBX para de otra manera aufsparen y podría el Línea hiervor sparen) PUSH EAX // Parámetro en el Stack pushen LOOP Bucle // ECX en 1 verringern y zurückspringen, a 0 erreicht es CALL Par3 // Función aufrufen ENDASM
cls _hGluDll&=@usedll("glu32.dll") _gluLookAtFuncAddr&=@external("kernel32.dll","GetProcAddress",_hGluDll&,"gluLookAt") 'Adresse el aufzurufenden Función ermitteln _params&[1]=@long(@addr(eyeX!),0) _params&[2]=@long(@addr(eyeX!),4) _params&[3]=@long(@addr(eyeY!),0) _params&[4]=@long(@addr(eyeY!),4) _params&[5]=@long(@addr(eyeZ!),0) _params&[6]=@long(@addr(eyeZ!),4) _params&[7]=@long(@addr(centerX!),0) _params&[8]=@long(@addr(centerX!),4) _params&[9]=@long(@addr(centerY!),0) _params&[10]=@long(@addr(centerY!),4) _params&[11]=@long(@addr(centerZ!),0) _params&[12]=@long(@addr(centerZ!),4) _params&[13]=@long(@addr(upX!),0) _params&[14]=@long(@addr(upX!),4) _params&[15]=@long(@addr(upY!),0) _params&[16]=@long(@addr(upY!),4) _params&[17]=@long(@addr(upZ!),0) _params&[18]=@long(@addr(upZ!),4) imprimir LoopAndCall(18,@addr(_params&[1]),_gluLookAtFuncAddr&) '1. Parámetro: Anzahl Parámetro, 2. Parámetro: Adresse des Parámetro-Arrays, 3. Parámetro: Funktionsadresse waitinput freedll _hGluDll& end
Bitte verzeiht me el Ensamblador-Code, Yo todavía nie (sic!) irgendetwas Sinnvolles en Ensamblador zustandebekommen, obwohl Yo oft intenta habe. Aus diesem Grund Yo el así intensiv y vermutlich muy laienhaft kommentiert. Wahrscheinlich sería alguien, el se así wirklich auskennt, el eleganter hacer, pero funktioniert.
Beste Grüße, Jens-Arne |
| | | XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 04.08.2023 ▲ |
| |
| |  Jens-Arne Reumschüssel | So, y kann me ahora Por favor, irgendjemand erklären, como ser kann, dass gluLookAt en glu32.dll neun *Float*-Werte como Parámetro esperado, el 64 bit breit son? Jeder 32-bit-Compiler übergibt 32-bit-Werte como Parámetro en el Stack. Como se porque algo como sin unseren mühsamen Workaround-Murks oben Por favor, ir? Das kann Yo überhaupt no begreifen.
Siehe [...] 
Saludo, Jens-Arne |
| | | XProfan X4XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 04.08.2023 ▲ |
| |
| |  Sven Bader | Auch hier una vez más danke para deine tolle Ensamblador Función!
In el OpenGL DLL es jede Función mehrfach enthalten para 2, manchmal 5 Datentypen. Das sieht el así de:
glTranslatef() para 32 Bit Float glTranslated() para 64 Bit Float
El Función entspricht el XProfan ogl("move",x,y,z)
glu scheint dieses Anatz no a verfolgen y nimmt entonces en el Zweifel más veces Double, qué natürlich en el 3D-Kontext no falso es. |
| | | | |
| |  Jens-Arne Reumschüssel | Yo habe el ASM-Función para el verschiedenen Calling-Conventions generalisiert, sodass así jede erdenkliche 32-bit-DLL bedient voluntad kann. Außerdem Yo ellos en PushParamsAndCall umbenannt.
declarar _params&[],_hGluDll&,_gluLookAtFuncAddr& declarar eyeX!,eyeY!,eyeZ!,centerX!,centerY!,centerZ!,upX!,upY!,upZ!
def &stdcall 1 'Parámetro absteigend en el Stack, Función bereinigt el Stack def &cdecl 2 'Parámetro absteigend en el Stack, Aufrufer muss el Stack incluso bereinigen def &pascal 3 'Parámetro aufsteigend en el Stack, Función bereinigt el Stack
ASM "PushParamsAndCall",4 MOV ECX,Par1 'ECX=Count-Register para el Bucle con el Anzahl Parámetro en el Array invitar, se cada Loop en 1 verringert (Parámetro-Nummer en el Array, el Parámetro necesario, außer en Pascal-Calling-Convention, rückwärts en el Stack gepusht voluntad [FILO]) MOV EDX,Par2 'Offset des Array-Speichers en EDX invitar (es más rápido como el Zugriff encima el Parámetro, welcher auch ginge) MOV EAX,Par4 '1=stdcall, 2=cdecl, 3=Pascal CMP EAX,3 JZ PascalSchleife Bucle: MOV EAX,ECX 'aktuellen Schleifenzählerstand (=Nummer des aktuellen Paramters en el Array) en EAX invitar DEC EAX 'EAX=ECX-1 (Speicher-Offset en el Array es nullbasiert); SUB EAX,1 ginge auch ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt =EAX*2 ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt zusammen con el Línea davor =EAX*4 (el es el Offset para el Parámetro en el Array-Speicher) ADD EAX,EDX 'Offset des Array-Speicherbereichs a EAX dazuaddieren MOV EAX,[EAX] 'Parámetro a el Speicheradresse en EAX invitar PUSH EAX 'Parámetro en el Stack pushen LOOP Bucle 'ECX en 1 verringern y zurückspringen, a 0 erreicht es JMP CallFunction PascalSchleife: MOV EAX,Par1 SUB EAX,ECX 'Parámetro en aufsteigender Reihenfolge en el Stack legen (Pascal-Calling-Convention) ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt =EAX*2 ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt zusammen con el Línea davor =EAX*4 (el es el Offset para el Parámetro en el Array-Speicher) ADD EAX,EDX 'Offset des Array-Speicherbereichs a EAX dazuaddieren MOV EAX,[EAX] 'Parámetro a el Speicheradresse en EAX invitar PUSH EAX 'Parámetro en el Stack pushen LOOP PascalSchleife 'ECX en 1 verringern y zurückspringen, a 0 erreicht es CallFunction: CALL Par3 'Función aufrufen; de hier EAX no mehr anfassen, como en él el Rückgabewert es (oder EAX zwischenzeitlich sichern) MOV EBX,Par4 'ahora prüfen, si cdecl, entonces muss el Stack manuell bereinigt voluntad CMP EBX,2 JNZ Ende 'stdcall & Pascal: Stack wurde ya de el Función bereinigt MOV EBX,Par1 ADD EBX,EBX ADD EBX,EBX ADD ESP,EBX 'Stack bereinigen (cdecl) Ende: 'Volver-Valor es en EAX ENDASM
cls _hGluDll&=@usedll("glu32.dll") _gluLookAtFuncAddr&=@external("kernel32.dll","GetProcAddress",_hGluDll&,"gluLookAt") 'Adresse el aufzurufenden Función ermitteln _params&[1]=@long(@addr(eyeX!),0) _params&[2]=@long(@addr(eyeX!),4) _params&[3]=@long(@addr(eyeY!),0) _params&[4]=@long(@addr(eyeY!),4) _params&[5]=@long(@addr(eyeZ!),0) _params&[6]=@long(@addr(eyeZ!),4) _params&[7]=@long(@addr(centerX!),0) _params&[8]=@long(@addr(centerX!),4) _params&[9]=@long(@addr(centerY!),0) _params&[10]=@long(@addr(centerY!),4) _params&[11]=@long(@addr(centerZ!),0) _params&[12]=@long(@addr(centerZ!),4) _params&[13]=@long(@addr(upX!),0) _params&[14]=@long(@addr(upX!),4) _params&[15]=@long(@addr(upY!),0) _params&[16]=@long(@addr(upY!),4) _params&[17]=@long(@addr(upZ!),0) _params&[18]=@long(@addr(upZ!),4) imprimir PushParamsAndCall(18,@addr(_params&[1]),_gluLookAtFuncAddr&,&stdcall) '1. Parámetro: Anzahl Parámetro, 2. Parámetro: Adresse des Parámetro-Arrays, 3. Parámetro: Funktionsadresse, 4. Parámetro: Calling-Convention waitinput freedll _hGluDll& end
|
| | | XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 05.08.2023 ▲ |
| |
| |  Jens-Arne Reumschüssel | ...y aquí el Ensamblador-Función para XProfan a X3 (also sin Inline-Ensamblador):
declarar _cPushParamsAndCall#,_a%,_b% dim _cPushParamsAndCall#,75 'a XProfan 9: muss en long aligned ser, ggf. Ende con nullen auffüllen (hier es no aligned, se unten erledigt; antes XProfan 10 en 76 dimensionieren y una weiteres $00 anhängen) 'Opcodes en Zona escribir: long _cPushParamsAndCall#,0=$5589E58B,$4D088B55,$0C8B4514,$83F80374,$1089C848,$01C001C0,$01D08B00,$50E2F2EB,$108B4508,$29C801C0,$01C001D0,$8B0050E2,$F0FF5510,$8B5D1483,$FB027509,$8B5D0801,$DB01DB01,$DC89EC5D byte _cPushParamsAndCall#,72=$C2,$10,$00 'en long alignen (va sólo de XProfan 10, porque lo vorher kein "re"dim gab): if ((@sizeof(_cPushParamsAndCall#)) mod 4)<>0 dim _cPushParamsAndCall#,@sizeof(_cPushParamsAndCall#)+(4-((@sizeof(_cPushParamsAndCall#)) mod 4)) endif 'Bytes en cada long umdrehen: whileloop 0,@sizeof(_cPushParamsAndCall#)-4,4 _a%=@long(_cPushParamsAndCall#,&loop) whileloop 0,3 byte @addr(_b%),&loop=@byte(@addr(_a%),3-&loop) endwhile long _cPushParamsAndCall#,&Loop=_b% endwhile '... '... hier Parameterarray füllen etc. '... imprimir @call(_cPushParamsAndCall#,18,@addr(_params&[1]),_gluLookAtFuncAddr&,&stdcall) '1. Parámetro: Anzahl Parámetro, 2. Parámetro: Adresse des Parámetro-Arrays, 3. Parámetro: Funktionsadresse, 4. Parámetro: Calling-Convention disponer _cPushParamsAndCall#
|
| | | XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 07.10.2023 ▲ |
| |
| |  Jens-Arne Reumschüssel | Und, porque lo así schön es, todos otra vez para JRPC3 con FreeBasic, porque uno se así el sonst cada Aufruf de gluLookAt notwendige manuelle Setzen des Parámetro-Arrays con un Makro vom Hals schaffen kann y todos ebenfalls sin el XProfan-Inline-Ensamblador funktioniert (also para Versionen antes X4) - voll funktionsfähiges Ejemplo:
declarar _params&[],_hGluDll&,_gluLookAtFuncAddr&,_retval& declarar eyeX!,eyeY!,eyeZ!,centerX!,centerY!,centerZ!,upX!,upY!,upZ!
def &stdcall 1 'Parámetro absteigend en el Stack, Función bereinigt el Stack def &cdecl 2 'Parámetro absteigend en el Stack, Aufrufer muss el Stack incluso bereinigen def &pascal 3 'Parámetro aufsteigend en el Stack, Función bereinigt el Stack
fbPROC PushParamsAndCall(byval AnzParams as long,byval pArray as long,byval pFunc as long,byval CallingConv as long) as integer export dim as ulong ReturnValue ASM MOV ECX,[AnzParams] 'ECX=Count-Register para el Bucle con el Anzahl Parámetro en el Array invitar, se cada Loop en 1 verringert (Parámetro-Nummer en el Array, el Parámetro necesario, außer en Pascal-Calling-Convention, rückwärts en el Stack gepusht voluntad [FILO]) MOV EDX,[pArray] 'Offset des Array-Speichers en EDX invitar (es más rápido como el Zugriff encima el Parámetro, welcher auch ginge) MOV EAX,[CallingConv] '1=stdcall, 2=cdecl, 3=Pascal CMP EAX,3 JZ PascalSchleife Bucle: MOV EAX,ECX 'aktuellen Schleifenzählerstand (=Nummer des aktuellen Paramters en el Array) en EAX invitar DEC EAX 'EAX=ECX-1 (Speicher-Offset en el Array es nullbasiert); SUB EAX,1 ginge auch ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt =EAX*2 ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt zusammen con el Línea davor =EAX*4 (el es el Offset para el Parámetro en el Array-Speicher) ADD EAX,EDX 'Offset des Array-Speicherbereichs a EAX dazuaddieren MOV EAX,[EAX] 'Parámetro a el Speicheradresse en EAX invitar PUSH EAX 'Parámetro en el Stack pushen LOOP Bucle 'ECX en 1 verringern y zurückspringen, a 0 erreicht es JMP CallFunction PascalSchleife: MOV EAX,[AnzParams] SUB EAX,ECX 'Parámetro en aufsteigender Reihenfolge en el Stack legen (Pascal-Calling-Convention) ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt =EAX*2 ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt zusammen con el Línea davor =EAX*4 (el es el Offset para el Parámetro en el Array-Speicher) ADD EAX,EDX 'Offset des Array-Speicherbereichs a EAX dazuaddieren MOV EAX,[EAX] 'Parámetro a el Speicheradresse en EAX invitar PUSH EAX 'Parámetro en el Stack pushen LOOP PascalSchleife 'ECX en 1 verringern y zurückspringen, a 0 erreicht es CallFunction: CALL [pFunc] 'Función aufrufen; de hier EAX no mehr anfassen, como en él el Rückgabewert es (oder EAX zwischenzeitlich sichern) MOV EBX,[CallingConv] 'ahora prüfen, si cdecl, entonces muss el Stack manuell bereinigt voluntad CMP EBX,2 JNZ Ende 'stdcall & Pascal: Stack wurde ya de el Función bereinigt MOV EBX,[AnzParams] ADD EBX,EBX ADD EBX,EBX ADD ESP,EBX 'Stack bereinigen (cdecl) Ende: MOV [ReturnValue],EAX 'Rückgabewert el aufgerufenen de EAX conjunto ("MOV [Function],EAX" funktioniert no, porque JRPC3 automáticamente una "volver 0" al Ende el fbPROC ergänzt, si kein volver-Valor angegeben es, una entsprechende Compilerwarnung a vermeiden) FIN ASM volver ReturnValue ENDPROC 'PushParamsAndCall
MACRO mcrGluLookAt(#p1#,#p2#,#p3#,#p4#,#p5#,#p6#,#p7#,#p8#,#p9#) _params&[1]=@long(@addr(#p1#),0) _params&[2]=@long(@addr(#p1#),4) _params&[3]=@long(@addr(#p2#),0) _params&[4]=@long(@addr(#p2#),4) _params&[5]=@long(@addr(#p3#),0) _params&[6]=@long(@addr(#p3#),4) _params&[7]=@long(@addr(#p4#),0) _params&[8]=@long(@addr(#p4#),4) _params&[9]=@long(@addr(#p5#),0) _params&[10]=@long(@addr(#p5#),4) _params&[11]=@long(@addr(#p6#),0) _params&[12]=@long(@addr(#p6#),4) _params&[13]=@long(@addr(#p7#),0) _params&[14]=@long(@addr(#p7#),4) _params&[15]=@long(@addr(#p8#),0) _params&[16]=@long(@addr(#p8#),4) _params&[17]=@long(@addr(#p9#),0) _params&[18]=@long(@addr(#p9#),4) _retval&=@PushParamsAndCall(18,@addr(_params&[1]),_gluLookAtFuncAddr&,&stdcall) '1. Parámetro: Anzahl Parámetro, 2. Parámetro: Adresse des Parámetro-Arrays, 3. Parámetro: Funktionsadresse, 4. Parámetro: Calling-Convention ENDMACRO 'mcrGluLookAt
cls _hGluDll&=@usedll("glu32.dll") _gluLookAtFuncAddr&=@external("kernel32.dll","GetProcAddress",_hGluDll&,"gluLookAt") 'Adresse el aufzurufenden Función ermitteln mcrGluLookAt(eyeX!,eyeY!,eyeZ!,centerX!,centerY!,centerZ!,upX!,upY!,upZ!) imprimir _retval& waitinput freedll _hGluDll& end
|
| | | XProfan X4XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 07.10.2023 ▲ |
| |
|
RespuestaThemeninformationenDieses Thema ha 3 subscriber: |