From: Patrick Mochel (mochel@transmeta.com)
Date: Wed 06 Jun 2001 - 05:56:38 IDT
Something like this should work:
#include <asm/io.h>
void setPalette( uchar *thePalette )
{
uchar stat;
outb(0x14,0x3d6);
stat = inb( 0x3D7 ) & 0x8F;
outb(stat | 0x50,0x3D7);
while ( inb( 0x3D7 ) & 0x08 )
continue;
outb(0,0x3C8);
asm volatile ("rep ; outsb" ::
"c" (768), "S" (thePalette) :
"ecx", "esi");
}
Note you had the order of the operands for outb backwards.
Note also that you have to compile with some optimization for in/out to
work.
-pat
On Tue, 5 Jun 2001, Kevin D. Quitt wrote:
> The built-in routine to set the palette takes 8 milliseconds on my machine;
> this is way too slow - it is possible to write the palette entirely during
> the vertical blanking period. This code works for DOS:
>
> push ds
> mov dx, 0x3D6 // Select XR14
> mov al, 0x14
> out dx, al
>
> mov dx, 0x3D7 // Enable VSYNC, Retrace, and HSYNC
> in al, dx
> and al, 0x8F
> or al, 0x50
>
> out dx, al
> in al, dx
>
> mov dx, 0x3DA // Wait for Vertical retrace
>
> loop0:
>
> in al, dx
> and al, 0x08
> jz loop0
>
> mov dx, 0x3C8 // Send the palette
> mov al, 0
> out dx, al
> mov cx, 768
> lds si, pal
> mov dx, 0x3C9
> rep outsb
> pop ds
>
> I've translated it to:
>
> void setPalette( uchar *thePalette )
> {
> uchar stat;
>
> outb( 0x3D6, 0x14 ); // Select XR14
> stat = inb( 0x3D7 ) & 0x8F; // Enable VSYNC, Retrace, and HSYNC
> outb( 0x3D7, stat | 0x50 );
>
> while ( inb( 0x3D7 ) & 0x08 )
> continue;
>
> outb( 0x3C8, 0 ); // Send the palette
>
> /* How do I put in the in-line assembly here? */
>
> }
>
>
>
>
> --
> _
> Kevin D. Quitt KQuitt@ieeinc.com
> 96.37% of all statistics are made up
>
>
>
> ------------------------------------------------------------------
> Unsubscribe: To: listbot@svgalib.org
> Body: unsubscribe linux-svgalib
>
------------------------------------------------------------------
Unsubscribe: To: listbot@svgalib.org
Body: unsubscribe linux-svgalib
This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:24 IST