* Tseng Labs ET6000, ET6100 and ET6300 graphics driver for BeOS 5.
* Copyright (c) 2003-2004, Evgeniy Vladimirovich Bobkov.
\*****************************************************************************/
#include "bits.h"
* Set bits in a byte pointed by addr; mask must contain 0s at the bits
* positions to be set and must contain 1s at all other bits; val must
* contain the values of bits to be set.
*/
__inline void set8(volatile char *addr, char mask, char val)
{
if (mask == 0)
*addr = val;
else
*addr = (*addr & mask) | (val & ~mask);
}
__inline void set16(volatile short *addr, short mask, short val)
{
if (mask == 0)
*addr = val;
else
*addr = (*addr & mask) | (val & ~mask);
}
__inline void set32(volatile int *addr, int mask, int val)
{
if (mask == 0)
*addr = val;
else
*addr = (*addr & mask) | (val & ~mask);
}
__inline void ioSet8(short port, char mask, char val)
{
char current;
if (mask == 0) {
__asm__ __volatile__ (
"movb %0, %%al\n\t"
"movw %1, %%dx\n\t"
"outb %%al, %%dx"
:
: "r"(val), "r"(port)
: "%eax", "%edx"
);
}
else {
__asm__ __volatile__ (
"movw %1, %%dx;"
"inb %%dx, %%al;"
"movb %%al, %0"
: "=r"(current)
: "r"(port)
: "%eax", "%edx"
);
current = (current & mask) | (val & ~mask);
__asm__ __volatile__ (
"movb %0, %%al;"
"movw %1, %%dx;"
"outb %%al, %%dx"
:
: "r"(current), "r"(port)
: "%eax", "%edx"
);
}
}
__inline char ioGet8(short port)
{
char current;
__asm__ __volatile__ (
"movw %1, %%dx;"
"inb %%dx, %%al;"
"movb %%al, %0"
: "=r"(current)
: "r"(port)
: "%eax", "%edx"
);
return current;
}