⛏️ index : haiku.git

/*****************************************************************************\
 * 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"
            : /* no output */
            : "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"
            : /* no output */
            : "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;
}
/*****************************************************************************/