Blitz "decl" wrapper

Previous topic - Next topic

Kitty Hello

Attached a program that converts the .decl files from Blitz into a .gbas library, with function wrapping and basic comments for help-creation.


OK, fixed it some more. If you have float as BYREF, it will not work,yet. The rest seems OK.
Attached a bass.dll wrapper, too.

[attachment deleted by admin]

Heiko

ähm blöde frage, wie verwendet man den, wenn ich compilere und run drück, geht kurz fenszter auf und gleich wieder zu?!?

D2O

Quote from: Heiko on 2008-Jul-30
ähm blöde frage, wie verwendet man den, wenn ich compilere und run drück, geht kurz fenszter auf und gleich wieder zu?!?

Hi Heiko,
nur mal ganz kurz den source anschauen ;)

Dann siehst Du dass das ganze über Commandline funktioniert.
Also Exe erstellen und dann die decl auf die exe ziehen, fertig.
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

D2O

Sodele, irgendwas ist noch nicht ganz schlüssig :whistle:

Als ausgabe einer decl:

Quote.lib "BASSMOD.dll"

BASSMOD_GetVersion% () : "BASSMOD_GetVersion"
BASSMOD_ErrorGetCode% () : "BASSMOD_ErrorGetCode"

BASSMOD_Init% (device%,freq%,flags%) : "BASSMOD_Init"
BASSMOD_Free () : "BASSMOD_Free"
BASSMOD_GetCPU# () : "BASSMOD_GetCPU"
BASSMOD_SetVolume% (volume%) : "BASSMOD_SetVolume"
BASSMOD_GetVolume% () : "BASSMOD_GetVolume"
BASSMOD_GetDeviceDescription%(devnum%) : "BASSMOD_GetDeviceDescription"

BASSMOD_MusicDecode%(buffer*,length%) : "BASSMOD_MusicDecode"
BASSMOD_MusicLoad% (mem%,file$,offset%,lenght%,flags%) : "BASSMOD_MusicLoad"
BASSMOD_MusicPlay% () : "BASSMOD_MusicPlay"
BASSMOD_MusicFree () : "BASSMOD_MusicFree"
BASSMOD_MusicGetName$ () : "BASSMOD_MusicGetName"
BASSMOD_MusicGetLength% (playlen%) : "BASSMOD_MusicGetLength"

BASSMOD_MusicPlayEx% (pos%,flags%,reset%) : "BASSMOD_MusicPlayEx"
BASSMOD_MusicSetAmplify% (amp%) : "BASSMOD_MusicSetAmplify"
BASSMOD_MusicSetPositionScaler% (scale%) : "BASSMOD_MusicSetPositionScaler"
BASSMOD_MusicSetVolume% (chanins%, volume%) : "BASSMOD_MusicSetVolume"
BASSMOD_MusicGetVolume% (chanins%) : "BASSMOD_MusicGetVolume"

BASSMOD_MusicIsActive% () : "BASSMOD_MusicIsActive"
BASSMOD_MusicStop% () : "BASSMOD_MusicStop"
BASSMOD_MusicPause% () : "BASSMOD_MusicPause"
BASSMOD_MusicSetPosition% (pos%) : "BASSMOD_MusicSetPosition" 
BASSMOD_MusicGetPosition% () : "BASSMOD_MusicGetPosition"

BASSMOD_MusicSetSync%(typ%,param%,proc*,user%) : "BASSMOD_MusicSetSync"
BASSMOD_MusicRemoveSync%(Handle) : "BASSMOD_MusicRemoveSync"
   
.lib "Kernel32.dll"
BASSMOD_RtlMoveMemory1%(Destination*,Source,Length) : "RtlMoveMemory"
BASSMOD_RtlMoveMemory2%(Destination,Source*,Length) : "RtlMoveMemory"

.lib " "
BASSMOD_GetDeviceDescriptionString$(device%) : ""
BASSMOD_GetErrorString$() : ""
BASSMOD_MakeLong%(lo%,hi%) : ""
BASSMOD_MakeHiWord%(val%) : ""
BASSMOD_MakeLoWord%(val%) : ""

erhalte ich das hier:
Code (glbasic) Select

INLINE
#define LIB_NAME "BASSMOD.dll"
DECLARE_ALIAS(wrap_BASSMOD_GetVersion, LIB_NAME, "BASSMOD_GetVersion", (), int);
DECLARE_ALIAS(wrap_BASSMOD_ErrorGetCode, LIB_NAME, "BASSMOD_ErrorGetCode", (), int);
DECLARE_ALIAS(wrap_BASSMOD_Init, LIB_NAME, "BASSMOD_Init", (int,int,int), int);
DECLARE_ALIAS(wrap_BASSMOD_Free, LIB_NAME, "BASSMOD_Free", (), void);
DECLARE_ALIAS(wrap_BASSMOD_GetCPU, LIB_NAME, "BASSMOD_GetCPU", (), float);
DECLARE_ALIAS(wrap_BASSMOD_SetVolume, LIB_NAME, "BASSMOD_SetVolume", (int), int);
DECLARE_ALIAS(wrap_BASSMOD_GetVolume, LIB_NAME, "BASSMOD_GetVolume", (), int);
DECLARE_ALIAS(wrap_BASSMOD_GetDeviceDescription, LIB_NAME, "BASSMOD_GetDeviceDescription", (int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicDecode, LIB_NAME, "BASSMOD_MusicDecode", (void*,int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicLoad, LIB_NAME, "BASSMOD_MusicLoad", (int,char*,int,int,int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicPlay, LIB_NAME, "BASSMOD_MusicPlay", (), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicFree, LIB_NAME, "BASSMOD_MusicFree", (), void);
DECLARE_ALIAS(wrap_BASSMOD_MusicGetName, LIB_NAME, "BASSMOD_MusicGetName", (), char*);
DECLARE_ALIAS(wrap_BASSMOD_MusicGetLength, LIB_NAME, "BASSMOD_MusicGetLength", (int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicPlayEx, LIB_NAME, "BASSMOD_MusicPlayEx", (int,int,int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicSetAmplify, LIB_NAME, "BASSMOD_MusicSetAmplify", (int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicSetPositionScaler, LIB_NAME, "BASSMOD_MusicSetPositionScaler", (int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicSetVolume, LIB_NAME, "BASSMOD_MusicSetVolume", (int,int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicGetVolume, LIB_NAME, "BASSMOD_MusicGetVolume", (int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicIsActive, LIB_NAME, "BASSMOD_MusicIsActive", (), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicStop, LIB_NAME, "BASSMOD_MusicStop", (), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicPause, LIB_NAME, "BASSMOD_MusicPause", (), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicSetPosition, LIB_NAME, "BASSMOD_MusicSetPosition", (int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicGetPosition, LIB_NAME, "BASSMOD_MusicGetPosition", (), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicSetSync, LIB_NAME, "BASSMOD_MusicSetSync", (int,int,void*,int), int);
DECLARE_ALIAS(wrap_BASSMOD_MusicRemoveSync, LIB_NAME, "BASSMOD_MusicRemoveSync", (void), int);
#define LIB_NAME "Kernel32.dll"
DECLARE_ALIAS(wrap_BASSMOD_RtlMoveMemory1, LIB_NAME, "RtlMoveMemory", (void*,void,void), int);
DECLARE_ALIAS(wrap_BASSMOD_RtlMoveMemory2, LIB_NAME, "RtlMoveMemory", (void,void*,void), int);
#define LIB_NAME " "
DECLARE_ALIAS(wrap_BASSMOD_GetDeviceDescriptionString, LIB_NAME, "BASSMOD_GetDeviceDescriptionString", (int), char*);
DECLARE_ALIAS(wrap_BASSMOD_GetErrorString, LIB_NAME, "BASSMOD_GetErrorString", (), char*);
DECLARE_ALIAS(wrap_BASSMOD_MakeLong, LIB_NAME, "BASSMOD_MakeLong", (int,int), int);
DECLARE_ALIAS(wrap_BASSMOD_MakeHiWord, LIB_NAME, "BASSMOD_MakeHiWord", (int), int);
DECLARE_ALIAS(wrap_BASSMOD_MakeLoWord, LIB_NAME, "BASSMOD_MakeLoWord", (int), int);
ENDINLINE
//! BASSMOD_GetVersion
// \return
FUNCTION BASSMOD_GetVersion:
INLINE
return wrap_BASSMOD_GetVersion();
ENDINLINE
ENDFUNCTION
//! BASSMOD_ErrorGetCode
// \return
FUNCTION BASSMOD_ErrorGetCode:
INLINE
return wrap_BASSMOD_ErrorGetCode();
ENDINLINE
ENDFUNCTION
//! BASSMOD_Init
// \return
// \param device -
// \param freq -
// \param flags -
FUNCTION BASSMOD_Init: device,freq,flags
INLINE
return wrap_BASSMOD_Init((int)device,(int)freq,(int)flags);
ENDINLINE
ENDFUNCTION
//! BASSMOD_Free
FUNCTION BASSMOD_Free:
INLINE
wrap_BASSMOD_Free();
ENDINLINE
ENDFUNCTION
//! BASSMOD_GetCPU
// \return
FUNCTION BASSMOD_GetCPU:
INLINE
return wrap_BASSMOD_GetCPU();
ENDINLINE
ENDFUNCTION
//! BASSMOD_SetVolume
// \return
// \param volume -
FUNCTION BASSMOD_SetVolume: volume
INLINE
return wrap_BASSMOD_SetVolume((int)volume);
ENDINLINE
ENDFUNCTION
//! BASSMOD_GetVolume
// \return
FUNCTION BASSMOD_GetVolume:
INLINE
return wrap_BASSMOD_GetVolume();
ENDINLINE
ENDFUNCTION
//! BASSMOD_GetDeviceDescription
// \return
// \param devnum -
FUNCTION BASSMOD_GetDeviceDescription: devnum
INLINE
return wrap_BASSMOD_GetDeviceDescription((int)devnum);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicDecode
// \return
// \param buffer -
// \param length -
FUNCTION BASSMOD_MusicDecode: buffer,length
INLINE
return wrap_BASSMOD_MusicDecode((void*)(unsigned int)buffer,(int)length);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicLoad
// \return
// \param mem -
// \param file$ -
// \param offset -
// \param lenght -
// \param flags -
FUNCTION BASSMOD_MusicLoad: mem,file$,offset,lenght,flags
INLINE
file_Str.Alloc(512);
return wrap_BASSMOD_MusicLoad((int)mem,(char*)file_Str.GetStrData(),(int)offset,(int)lenght,(int)flags);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicPlay
// \return
FUNCTION BASSMOD_MusicPlay:
INLINE
return wrap_BASSMOD_MusicPlay();
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicFree
FUNCTION BASSMOD_MusicFree:
INLINE
wrap_BASSMOD_MusicFree();
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicGetName
// \return
FUNCTION BASSMOD_MusicGetName$:
INLINE
return wrap_BASSMOD_MusicGetName();
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicGetLength
// \return
// \param playlen -
FUNCTION BASSMOD_MusicGetLength: playlen
INLINE
return wrap_BASSMOD_MusicGetLength((int)playlen);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicPlayEx
// \return
// \param pos -
// \param flags -
// \param reset -
FUNCTION BASSMOD_MusicPlayEx: pos,flags,reset
INLINE
return wrap_BASSMOD_MusicPlayEx((int)pos,(int)flags,(int)reset);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicSetAmplify
// \return
// \param amp -
FUNCTION BASSMOD_MusicSetAmplify: amp
INLINE
return wrap_BASSMOD_MusicSetAmplify((int)amp);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicSetPositionScaler
// \return
// \param scale -
FUNCTION BASSMOD_MusicSetPositionScaler: scale
INLINE
return wrap_BASSMOD_MusicSetPositionScaler((int)scale);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicSetVolume
// \return
// \param chanins -
// \param volume -
FUNCTION BASSMOD_MusicSetVolume: chanins,volume
INLINE
return wrap_BASSMOD_MusicSetVolume((int)chanins,(int)volume);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicGetVolume
// \return
// \param chanins -
FUNCTION BASSMOD_MusicGetVolume: chanins
INLINE
return wrap_BASSMOD_MusicGetVolume((int)chanins);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicIsActive
// \return
FUNCTION BASSMOD_MusicIsActive:
INLINE
return wrap_BASSMOD_MusicIsActive();
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicStop
// \return
FUNCTION BASSMOD_MusicStop:
INLINE
return wrap_BASSMOD_MusicStop();
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicPause
// \return
FUNCTION BASSMOD_MusicPause:
INLINE
return wrap_BASSMOD_MusicPause();
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicSetPosition
// \return
// \param pos -
FUNCTION BASSMOD_MusicSetPosition: pos
INLINE
return wrap_BASSMOD_MusicSetPosition((int)pos);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicGetPosition
// \return
FUNCTION BASSMOD_MusicGetPosition:
INLINE
return wrap_BASSMOD_MusicGetPosition();
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicSetSync
// \return
// \param typ -
// \param param -
// \param proc -
// \param user -
FUNCTION BASSMOD_MusicSetSync: typ,param,proc,user
INLINE
return wrap_BASSMOD_MusicSetSync((int)typ,(int)param,(void*)(unsigned int)proc,(int)user);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MusicRemoveSync
// \return
// \param Handle -
FUNCTION BASSMOD_MusicRemoveSync: Handle
INLINE
return wrap_BASSMOD_MusicRemoveSync((void)Handle);
ENDINLINE
ENDFUNCTION
//! BASSMOD_RtlMoveMemory1
// \return
// \param Destination -
// \param Source -
// \param Length -
FUNCTION BASSMOD_RtlMoveMemory1: Destination,Source,Length
INLINE
return wrap_BASSMOD_RtlMoveMemory1((void*)(unsigned int)Destination,(void)Source,(void)Length);
ENDINLINE
ENDFUNCTION
//! BASSMOD_RtlMoveMemory2
// \return
// \param Destination -
// \param Source -
// \param Length -
FUNCTION BASSMOD_RtlMoveMemory2: Destination,Source,Length
INLINE
return wrap_BASSMOD_RtlMoveMemory2((void)Destination,(void*)(unsigned int)Source,(void)Length);
ENDINLINE
ENDFUNCTION
//! BASSMOD_GetDeviceDescriptionString
// \return
// \param device -
FUNCTION BASSMOD_GetDeviceDescriptionString$: device
INLINE
return wrap_BASSMOD_GetDeviceDescriptionString((int)device);
ENDINLINE
ENDFUNCTION
//! BASSMOD_GetErrorString
// \return
FUNCTION BASSMOD_GetErrorString$:
INLINE
return wrap_BASSMOD_GetErrorString();
ENDINLINE
ENDFUNCTION
//! BASSMOD_MakeLong
// \return
// \param lo -
// \param hi -
FUNCTION BASSMOD_MakeLong: lo,hi
INLINE
return wrap_BASSMOD_MakeLong((int)lo,(int)hi);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MakeHiWord
// \return
// \param val -
FUNCTION BASSMOD_MakeHiWord: val
INLINE
return wrap_BASSMOD_MakeHiWord((int)val);
ENDINLINE
ENDFUNCTION
//! BASSMOD_MakeLoWord
// \return
// \param val -
FUNCTION BASSMOD_MakeLoWord: val
INLINE
return wrap_BASSMOD_MakeLoWord((int)val);
ENDINLINE
ENDFUNCTION


der Fehlermeldung:
Quote
_______________________________________
*** Configuration: WIN32 ***
precompiling:
GPC - GLBasic Precompiler V.2008.210 - 3D, NET
Wordcount:0 commands

compiling:
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:44: error: `<anonymous>' has incomplete type
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:44: error: invalid use of `void'
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:44: error: `<anonymous>' has incomplete type
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:44: error: invalid use of `void'
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:45: error: `<anonymous>' has incomplete type
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:45: error: invalid use of `void'
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:45: error: `<anonymous>' has incomplete type
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:45: error: invalid use of `void'
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp: In function `DGInt __GLBASIC__::BASSMOD_MusicRemoveSync(DGInt)':
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:569: error: too many arguments to function
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp: In function `DGInt __GLBASIC__::BASSMOD_RtlMoveMemory1(DGInt, DGInt, DGInt)':
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:593: error: void value not ignored as it ought to be
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp: In function `DGInt __GLBASIC__::BASSMOD_RtlMoveMemory2(DGInt, DGInt, DGInt)':
C:\DOKUME~1\Fabbio\LOKALE~1\Temp\glbasic\gpc_temp1.cpp:617: error: void value not ignored as it ought to be
*** FATAL ERROR - Bitte die Compiler-Ausgabe ins Forum kopieren
_______________________________________
*** Fertig ***
Dauer: 1.0 sek. Zeit: 18:25
Erstellen: 0 erfolgreich.
*** 1 FEHLGESCHLAGEN ***

Ich glaube, da ich kein C/Cpp profie bin das der hund hier begraben ist:
Code (glbasic) Select
DECLARE_ALIAS(wrap_BASSMOD_GetVersion, LIB_NAME, "BASSMOD_GetVersion", (), int);
und es mehr so aussehen sollte:
Code (glbasic) Select
DECLARE_ALIAS(wrap_BASSMOD_GetVersion, LIB_NAME, BASSMOD_GetVersion (int);
kan mich auch täuschen =D
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Heiko

#4
nööö, die zweiten "" hinten sind schon korrekt, soweit ich weiß.

und der das mitm void usw. läßt darauf schliessen, dass die dll was anderes als return erwartet bzw. als übergebenen parameter, aber das zählt halt zu der problematik, die gernot ansprach, dass man hinterher bei den datentypen eh nachbessern muss.

aber auf jeden fall ne schicke ausgabe, grins.

D2O

Hmmm, ich dachte das das Problem in der alleine stehenden klammer steckt, ,,(),int)
wusste nicht mehr ob es sowas gab :S
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Heiko

Code (glbasic) Select
DECLARE_ALIAS(xGetFPS, DLL, "_xGetFPS@0",(),long);

nein, so is das bei mir auch normal.

wird halt kein wert an die funktion übergeben und ein long integer zurückgegeben.

Kitty Hello

1. in der decl:
.lib " "

Was soll das heissen?

2. .lib "Kernel32.dll"
BASSMOD_RtlMoveMemory1%(Destination*,Source,Length) : "RtlMoveMemory"
BASSMOD_RtlMoveMemory2%(Destination,Source*,Length) : "RtlMoveMemory"

Welchen Typ haben "Source" und "Length"? Muss da nicht ein # stehen?

Schranz0r

@ Gernot:

Wenn in der Decal datei steht:

.lib " "

dann werden die Funktionen nur zum Highlighten hergenommen!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

...also - die machen dann nichts?

Schranz0r

Genau, da ja in der *.bb-Datei(Projectdatei von BlitzBasic) auch alles nochmal in Funktionen gepackt wird.
Also allein nur für Highlighten.
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

OK. Update im 1. Post. Ich hab auch die Parameter ohne "#,$,%..." jetzt als "int" gemacht und meherere Libs in einer Datei unterstützt. Wird schon langsam ;)

Schranz0r

Gernot, ein Filerequest wär gut zum öffnen ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Heiko

tipp, ich würd statt int long machen.

bei pb is das standard, und ich hab ja die pb include zum umbauen zu beginn genommen, und da ist fast alles long statt int, wenn nicht soagr ganz alles.

läßt halt ein paar rückschlüsse zu, wenn ich das richtig verstanden hab, naja notfalls gibts ja die von hand "ersetzen" funktion im editor, schönes feature übrigends, grins

Schranz0r

Long braucht halt mehr speicher..
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard