1/*****************************************************************************\
2 * Tseng Labs ET6000, ET6100 and ET6300 graphics driver for BeOS 5.
3 * Copyright (c) 2003-2004, Evgeniy Vladimirovich Bobkov.
4\*****************************************************************************/
5
6#include "bits.h"
7
8
9/*****************************************************************************/
10/*
11 * Set bits in a byte pointed by addr; mask must contain 0s at the bits
12 * positions to be set and must contain 1s at all other bits; val must
13 * contain the values of bits to be set.
14 */
15__inline void set8(volatile char *addr, char mask, char val)
16{
17    if (mask == 0)
18        *addr = val;
19    else
20        *addr = (*addr & mask) | (val & ~mask);
21}
22/*****************************************************************************/
23__inline void set16(volatile short *addr, short mask, short val)
24{
25    if (mask == 0)
26        *addr = val;
27    else
28        *addr = (*addr & mask) | (val & ~mask);
29}
30/*****************************************************************************/
31__inline void set32(volatile int *addr, int mask, int val)
32{
33    if (mask == 0)
34        *addr = val;
35    else
36        *addr = (*addr & mask) | (val & ~mask);
37}
38/*****************************************************************************/
39__inline void ioSet8(short port, char mask, char val)
40{
41char current;
42    if (mask == 0) {
43        __asm__ __volatile__ (
44            "movb %0, %%al\n\t"
45            "movw %1, %%dx\n\t"
46            "outb %%al, %%dx"
47            : /* no output */
48            : "r"(val), "r"(port)
49            : "%eax", "%edx"
50        );
51    }
52    else {
53        __asm__ __volatile__ (
54            "movw %1, %%dx;"
55            "inb %%dx, %%al;"
56            "movb %%al, %0"
57            : "=r"(current)
58            : "r"(port)
59            : "%eax", "%edx"
60        );
61        current = (current & mask) | (val & ~mask);
62        __asm__ __volatile__ (
63            "movb %0, %%al;"
64            "movw %1, %%dx;"
65            "outb %%al, %%dx"
66            : /* no output */
67            : "r"(current), "r"(port)
68            : "%eax", "%edx"
69        );
70    }
71}
72/*****************************************************************************/
73__inline char ioGet8(short port)
74{
75char current;
76    __asm__ __volatile__ (
77        "movw %1, %%dx;"
78        "inb %%dx, %%al;"
79        "movb %%al, %0"
80        : "=r"(current)
81        : "r"(port)
82        : "%eax", "%edx"
83    );
84    return current;
85}
86/*****************************************************************************/
87