Valhalla Legends Forums Archive | General Programming | Code Submission - Extended Boolean Math

AuthorMessageTime
n00blar
These are some advanced extended boolean functions you can put in a dll and export for visual basic. I originaly designed these to use for a game that is being made in visual basic using TrueVision3D! This also is an example of using naked functions for you guys who have never used them!

[code]
#define Param1 [ebp+0x08]
#define Param2 [ebp+0x0C]
#define BitMask 0x00000001
#define NAKED __declspec(naked)

bool EXOR(bool x, bool y);
bool Implication(bool x, bool y);
bool Inhibition(bool x, bool y);
bool NAND(bool x, bool y);
bool NOR(bool x, bool y);


NAKED bool EXOR(bool x, bool y)
{
     // Prolog
     __asm
     {
           push ebp
           mov ebp, esp
           sub esp, __LOCAL_SIZE
     }

     // Functionality
     __asm
     {
           mov ecx, Param1
           xor ecx, Param2
           xor ecx, BitMask
           mov eax, ecx
     }

     // Epilog
     __asm
     {
     mov esp, ebp
     pop ebp
     ret
     }
}

NAKED bool Implication(bool x, bool y)
{
     // Prolog
     __asm
     {
           push ebp
           mov ebp, esp
           sub esp, __LOCAL_SIZE
     }
     
     // Functionality
     __asm
     {
           cmp Param1, 0x01
           jz lbl_true
           mov eax, Param2
           xor eax, BitMask
           jmp lbl_done
lbl_true:
           mov eax, Param2
lbl_done:
     }

     // Epilog
     __asm
     {
     mov esp, ebp
     pop ebp
     ret
     }
}

NAKED bool Inhibition(bool x, bool y)
{
     // Prolog
     __asm
     {
           push ebp
           mov ebp, esp
           sub esp, __LOCAL_SIZE
     }
     
     // Functionality
     __asm
     {
           mov ecx, Param2
           xor ecx, BitMask
           cmp Param1, ecx
           jz      lbl_true
           mov eax, 0x00
           jmp lbl_done
lbl_true:
           mov eax, 0x01
lbl_done:
     }

     // Epilog
     __asm
     {
     mov esp, ebp
     pop ebp
     ret
     }
}

NAKED bool NAND(bool x, bool y)
{
     // Prolog
     __asm
     {
           push ebp
           mov ebp, esp
           sub esp, __LOCAL_SIZE
     }
     
     // Functionality
     __asm
     {
           mov ecx, Param1
           and ecx, Param2
           xor ecx, BitMask
           mov eax, ecx
     }

     // Epilog
     __asm
     {
     mov esp, ebp
     pop ebp
     ret
     }
}

NAKED bool NOR(bool x, bool y)
{
     // Prolog
     __asm
     {
           push ebp
           mov ebp, esp
           sub esp, __LOCAL_SIZE
     }
     
     // Functionality
     __asm
     {
           mov ecx, Param1
           or ecx, Param2
           xor ecx, BitMask
           mov eax, ecx
     }

     // Epilog
     __asm
     {
     mov esp, ebp
     pop ebp
     ret
     }
}
[/code]
December 23, 2002, 10:42 PM
Yoni
IMO, if you write these functions in VB instead of in ASM, they will run faster, since VB is stupid and dynamically loads all DLLs you want to import functions from. Worth checking though.
December 24, 2002, 2:26 PM
n00blar
or i could assemble them and load them into a string array and use callwindprocedure but uh-- I think its faster in asm than visual basic! Have you ever seen a visual basic function its really icky and slow!
December 24, 2002, 3:31 PM
Skywing
[quote]or i could assemble them and load them into a string array and use callwindprocedure but uh-- I think its faster in asm than visual basic! Have you ever seen a visual basic function its really icky and slow![/quote]
That's bad.  The WNDPROC parameter passed to CallWindowProc isn't guaranteed to be a real pointer.
[quote]lpPrevWndFunc
[in] Pointer to the previous window procedure.
If this value is obtained by calling the GetWindowLong function with the nIndex parameter set to GWL_WNDPROC or DWL_DLGPROC, it is actually either the address of a window or dialog box procedure, or a special internal value meaningful only to CallWindowProc.[/quote]

Use at risk of your program breaking with no warning.
December 24, 2002, 11:06 PM
n00blar
Thanks for the information skywing. I never knew that; probably because I never looked! However, I still think using a DLL will be faster than a visual basic function though.
December 25, 2002, 12:40 PM
Yoni
Umm, either way, using CallWindowProc = dynamically loading user32.dll... Though it'll be much faster than dynamically loading a different dll (since user32.dll is always loaded, so all it'll do is increment a reference count, if at all), it'll still have to call GetProcAddress, search for the CallWindowProc function in the user32.dll export table, etc... Plus, if you're using VB6, it has some restrictions on callback functions (which VB5 didn't have), which may apply in this case (not sure if they do). Either way, I think it'll still be slower.
December 25, 2002, 12:49 PM
iago
Well, there's only one way to find out.. do it 50000 times each way and see which goes faster! :-D
December 26, 2002, 3:27 AM

Search