Using Assembly to Plot a Pixel onto a DirectDraw Surface

Started by
5 comments, last by TUna 24 years, 2 months ago
I'm having a bit of a problem putting a pixel on a DX surface with ASM. Here's a snippet of the code: inline void plotPixel(WORD *surfPtr, DWORD dwPitch, int X, int Y, int Red, int Green, int Blue) { WORD col = (WORD)RGBToColour(Red, Green, Blue); _asm { PUSH eax // Save current values PUSH ebx MOV eax, X MOV ebx, Y ADD eax, ebx // Add X and Y MOV ebx, dwPitch MUL ebx // Multiply the result by dwPitch ADD surfPtr, eax MOV bx, col // Shift the colour into BX MOV WORD PTR surfPtr, bx // Move the colour onto the surface POP ebx // Reset to old values POP eax } }; The surface has been locked, and I have got the pitch from the DDSURFACEDESC etc... The code works fine when I use normal C++ [surfPtr[X + Y * dwPitch] = (WORD)RGBToColour(Red, Green, Blue);] I presume its something to do with adding to the surf pointer and/or moving the colour onto the surface. Thanks Edited by - TUna on 2/10/00 10:58:30 PM
Advertisement

You''re adding X and Y before you multiply
Y by the pitch.

Also, are you using a 16bpp surface? If so,
you need to multiply X by 2 (or shift it left
once) before you add it in.

Try this:

MOV eax, dwPitch
MUL Y
MOV ebx, X
SHL ebx, 1
ADD eax, ebx
MOV WORD PTR eax, col
It doesn''t seem to like the MOV WORD PTR eax, col.
Here''s the error MSG: error C2421: PTR operator used with register in ''first operand''

Any ideas?
Thanks
Why use asm to do this?

Oops, sorry...

Try this instead:

MOV eax, dwPitch
MUL Y
MOV ebx, X
SHL ebx, 1
ADD ebx, eax
MOV ax, col
MOV [word ptr ebx], ax
Hey, if you want to give a little boost to your code, here are some things you may want to consider.

1) You do not need to do a PUSH EAX and PUSH EBX to preserve the registers as the compiler will do this for you (if you are using Visual C++).

2) I''m assuming that you are writing to a 16-bit surface because of your surfPtr being a WORD pointer, this means that you will need to intermix 16-bit and 32-bit code together which, if not done right will cause penalty stalls on the Pentium processors (ya it''s stupid, I know!).

3) If your writing one pixel at a time at a specific location, then this function is useful, BUT if you are writing a series of pixels to the screen at a time, then you should modify the algorithm to write 2 16-bit pixels at a time, this is twice as fast because the bus is 32-bits wide, so when you write just 16-bits your only using half the bandwidth.


Good luck.



~-------------------------------------------------------~
Fred Di Sano
System Programmer - Artech Studios (Ottawa.CA)
~-------------------------------------------------------~
~-------------------------------------------------------~ Fred Di Sano System Programmer - Artech Studios (Ottawa.CA)~-------------------------------------------------------~
i think you could do this in C because in your function you use RGBToColour and this is probably longer to execute than the rest of the function
cyberg- cyberg_coder@hotmail.com- http://members.xoom.com/cybergsoft

This topic is closed to new replies.

Advertisement