Mail Archives: djgpp/1999/06/16/20:00:18.1
Gathers wrote:
>
> I can't get the getpixel function here to work, but the putpixel under
> it seems to work ok, can someone help me?
lodsb acts relative to ds, not es. You should load your segment into
%ds.
A few other problems:
1. You need to restore es and ds after changing them. GCC expects them
not to change. Adding them to the clobber list will NOT work, so either
push/pop or use another register.
2. You don't tell the compiler that %si or %di are being clobbered.
And some efficiency issues, if you're interested:
3. It's pointless to zero a register before overwriting it.
4. This code will run faster if you use the 32-bit registers and
instructions. In protected mode, there is a 1-cycle penalty on each
16-bit instruction.
5. It's probably simpler to use an indirect move instead of stosb/lodsb.
6. The multiply can be optimized better; this is left as an exercise for
the reader.
In fact, you could let the compiler do all this:
#include <sys/farptr.h>
#define mygetpixel(seg, add, x, y) (_farpeekb((seg), (add) + (x) + ((y)
* 320)))
#define myputpixel(seg, add, x, y, c) (_farpokeb((seg), (add) + (x) +
((y) * 320), (c)))
The quality of the code, if optimization is on (you can find it by using
-S), may surprise you.
>
> /Gathers
>
> unsigned char mygetpixel(unsigned short seg,unsigned long add,unsigned
> short x,unsigned short y)
> {
> unsigned char c;
> asm("movw %1,%%ax\n\t"
> "movw %%ax,%%es\n\t"
> "xor %%ax,%%ax\n\t"
> "movw %2,%%ax\n\t"
> "xor %%bx,%%bx\n\t"
> "movw $0x140,%%bx\n\t"
> "mul %%bx\n\t"
> "addl %3,%%ax\n\t"
> "addw %4,%%ax\n\t"
> "movl %%ax,%%si\n\t"
> "lodsb\n\t"
> "movb %%al,%0\n\t"
> :"g="(c)
> :"g"(seg),"g"(y),"g"(add),"g"(x)
> :"ax","bx","memory"
> );
> return c;
> }
>
> void myputpixel(unsigned short seg,unsigned long add,unsigned short
> x,unsigned short y,unsigned char c)
> {
> asm("movw %0,%%ax\n\t"
> "movw %%ax,%%es\n\t"
> "xor %%ax,%%ax\n\t"
> "movw %1,%%ax\n\t"
> "xor %%bx,%%bx\n\t"
> "movw $0x140,%%bx\n\t"
> "mul %%bx\n\t"
> "addl %2,%%ax\n\t"
> "addw %3,%%ax\n\t"
> "movl %%ax,%%di\n\t"
> "movb %4,%%al\n\t"
> "stosb"
> :
> :"g"(seg),"g"(y),"g"(add),"g"(x),"g"(c)
> :"ax","bx","memory"
> );
> }
--
Nate Eldredge
nate AT cartsys DOT com
- Raw text -