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