home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / x / xibm.zip / ibm8514 / brcImg.c < prev    next >
C/C++ Source or Header  |  1991-09-30  |  10KB  |  406 lines

  1. /*
  2.  * $Id: brcImg.c,v 1.2 1991/10/01 02:32:04 mtranle Exp $
  3.  *
  4.  * Copyright IBM Corporation 1987,1990
  5.  *
  6.  * All Rights Reserved
  7.  *
  8.  * Permission to use, copy, modify, and distribute this software and its
  9.  * documentation for any purpose and without fee is hereby granted,
  10.  * provided that the above copyright notice appear in all copies and that 
  11.  * both that copyright notice and this permission notice appear in
  12.  * supporting documentation, and that the name of IBM not be
  13.  * used in advertising or publicity pertaining to distribution of the
  14.  * software without specific, written prior permission.
  15.  *
  16.  * IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  17.  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
  18.  * IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  19.  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20.  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  21.  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  22.  * SOFTWARE.
  23.  *
  24. */
  25. /*
  26.  * PRPQ 5799-PFF (C) COPYRIGHT IBM CORPORATION 1987,1990
  27.  * LICENSED MATERIALS - PROPERTY OF IBM
  28.  * REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
  29.  */
  30. /*
  31.  *  Hardware interface routines for IBM 8514/A adapter for
  32.  *  X.11 server(s) on IBM equipment.
  33.  *
  34.  */
  35.  
  36. /* IMAGES
  37.  * Read and Write Full Color Images to/from 8514/A
  38.  *
  39.  */
  40. #include "X.h"
  41.  
  42. #include "servermd.h"
  43.  
  44. #include "OScompiler.h"
  45.  
  46. #include "x8514.h"
  47.  
  48. #include "ibmTrace.h"
  49.  
  50. extern int mergexlate[16] ;
  51. extern int ibm8514cursorSemaphore ;
  52.  
  53.  
  54. #if defined(ibm032) && defined(ATRIO)
  55. /* on the 386 blockoutw should be assembly coded to use "rep outs %dx, *%esi" 
  56.  */
  57. static void
  58. blockoutw( values, n )
  59.      unsigned char *values ;
  60.      int n ;
  61. {
  62.     /* I/O port type is 4 bytes for 6152 but only 2 for i386 !! */
  63.     register volatile unsigned long int *ptr ;
  64.  
  65.     if ( !n )
  66.     return ;
  67.  
  68.     ptr = (volatile unsigned long int *) ( VARDATA | WORDADD ) ;
  69.  
  70.     /* Test Alignment */
  71.     if ( ( (unsigned long int) values ) & 1 )
  72.     {
  73.     unsigned long int tmpBuf ;
  74.  
  75.     tmpBuf = *values++ << 16 ; /* Now We're Aligned */
  76.     while ( --n )
  77.     {
  78.         tmpBuf |= *( (unsigned short int *) values ) ;
  79.         *ptr = (unsigned long int) ( tmpBuf >> 8 ) ;
  80.         values += sizeof (unsigned short int) ;
  81.         tmpBuf <<= 16 ;
  82.     }
  83.     *ptr = (unsigned long int) ( ( tmpBuf >> 8 ) | *values ) ;
  84.     }
  85.     else
  86.     for ( n++ ; --n ; values += sizeof (unsigned short int) )
  87.         *ptr = (unsigned long int) *( (unsigned short int *) values ) ;
  88.  
  89.     return ;
  90. }
  91. static void
  92. blockinw( data, n )
  93.      unsigned char *data ;
  94.      int n ;
  95. {
  96.     /* I/O port type is 4 bytes for 6152 but only 2 for i386 !! */
  97.     register unsigned long int *ptr ;
  98.  
  99.     if ( !n )
  100.     return ;
  101.  
  102.     ptr = (unsigned long int *) ( VARDATA | WORDADD ) ;
  103.  
  104.     /* Test Alignment */
  105.     if ( ( (unsigned long int) data ) & 1 )
  106.     {
  107.     unsigned long int tmpBuf ;
  108.  
  109.     tmpBuf = *ptr ;
  110.     *data++ = tmpBuf >> 8 ;
  111.     tmpBuf <<= 16 ;
  112.     while ( --n )
  113.     {
  114.         tmpBuf |= (unsigned short) *ptr ;
  115.         *( (unsigned short int *) data ) = tmpBuf >> 8 ;
  116.         tmpBuf <<= 16 ;
  117.         data += sizeof (unsigned short int) ;
  118.     }
  119.     *data = tmpBuf >> 16 ;
  120.  
  121.     }
  122.     else
  123.     for ( n++ ; --n ; data += sizeof (unsigned short int) )
  124.         *( (unsigned short int *) data ) = (unsigned short) *ptr ;
  125.  
  126.     return ;
  127. }
  128.  
  129. #else /* not ibm032 */
  130.  
  131. # if defined(i386) && defined(PCIO)
  132. #  ifdef USE_PORTABLE_BLOCKOUTW
  133. static void
  134. blockoutw( values, n )
  135.      unsigned short *values ;
  136.      int n ;
  137. {
  138. #if HALFQBUF != 4
  139.     ******** ERROR ********
  140. #endif
  141.     for ( ; n >= HALFQBUF ; n -= HALFQBUF )
  142.     {
  143.            ibm8514ClearQueue( HALFQBUF ) ;
  144.         outw( VARDATA, *values++ ) ;    /* This assume that HALFQBUF is 4 */
  145.         outw( VARDATA, *values++ ) ;
  146.         outw( VARDATA, *values++ ) ;
  147.         outw( VARDATA, *values++ ) ;
  148.     }
  149.     if ( n )
  150.     {        /* Left over < HALFQBUF */
  151.            ibm8514ClearQueue( n ) ;
  152.         while ( n-- )
  153.             outw( VARDATA, *values++ ) ;
  154.     }
  155.     return ;
  156. }
  157. #  else /* not USE_PORTABLE_BLOCKOUTW */
  158.  
  159. #   ifdef __GNUC__
  160. /* for comments look in the file blkout.s
  161.  * all the jmp have been made relative to '.'
  162.  * and ibmCheckQueue() have been removed.
  163.  */
  164. #define blockoutw( ptr, n )        \
  165. ({ void * __ptr = (ptr);        \
  166.    int    __n   = (n);            \
  167.    __asm volatile (            \
  168.        "movw    $0xE2E8, %%edx        \n\
  169.     rep                \n\
  170.     outsw"                \
  171.     : "S=" (__ptr), "c=" (__n)    \
  172.     : "0"  (__ptr), "1"  (__n)    \
  173.     : "ax", "dx");            \
  174.  })
  175.  
  176. #define blockinw( ptr, n )         \
  177. ({ void * __ptr = (ptr);        \
  178.    int    __n   = (n);            \
  179.    __asm volatile (            \
  180.     "testl    %1, %1            \n\
  181.     jz    . + 17 /* done3 */    \n\
  182.     movw    $0xE2E8, %%dx        \n\
  183. /* loop3: */                \n\
  184.     inw    (%%dx)            \n\
  185.     movw    %%ax, (%0)        \n\
  186.     addl    $2, %0            \n\
  187.     decl    %1            \n\
  188.     jnz    . - 9 /* loop3 */    \n\
  189. /* done3: */"                 \
  190.     : "c=" (__ptr), "S=" (__n)    \
  191.     : "0"  (__ptr), "1"  (__n)    \
  192.     : "ax", "dx" );         \
  193.  })
  194.  
  195. #   else /* not __GNUC__ */
  196.  
  197. extern void blockoutw() ;    /* defined in blkout.s */
  198.  
  199. static void
  200. blockinw( data, n )
  201.      unsigned char *data ;
  202.      int n ;
  203. {
  204.     for ( n++ ; --n ; data += sizeof (unsigned short int) )
  205.     *( (unsigned short int *) data ) = inw( VARDATA ) ;
  206.  
  207.     return ;
  208. }
  209.  
  210. #   endif /* __GNUC__ */
  211. #  endif /* not USE_PORTABLE_BLOCKOUTW */
  212.  
  213. # else /* not i386 */
  214.  
  215. #  error ******** ERROR -- RT w/ Family-1 Bus ??
  216. # endif
  217. #endif  
  218.  
  219.  
  220. void
  221. ibm8514DrawColorImage( x, y, w, h, data, RowIncrement, merge, planes )
  222.      int x,y ;
  223.      int w ;
  224.      int h ;
  225.      unsigned char *data ;
  226.      int RowIncrement ;
  227.      int merge ;
  228.      unsigned long int planes ;
  229. {
  230.     int saved ;
  231.  
  232.     TRACE( ( "ibm8514DrawColorImage(x=%d,y=%d,w=%d,h=%d,data=x%x,RowIncrement=%d,merge=x%x,planes=x%x)\n",
  233.         x, y, w, h, data, RowIncrement, merge, planes ) ) ;
  234.  
  235.     if ( ( w <= 0 ) || ( h <= 0 ) )
  236.     return ;
  237.  
  238.     saved = !ibm8514cursorSemaphore && ibm8514CheckCursor( x, y, w, h ) ;
  239.  
  240.     ibm8514ATRNotBusy ;
  241.     ibm8514ClearQueue( 7 ) ;
  242.     PLNWENBL( planes ) ;
  243.     SETFN1( FNVAR, mergexlate[ merge ] ) ; /* don't overlook that FNVAR */
  244.     SETX0( x ) ;
  245.     SETY0( y ) ;
  246.     SETLX( w - 1 ) ;
  247.     SETLY( h - 1 ) ;
  248.  
  249.     COMMAND( ibm8514WriteZData ) ;
  250.  
  251.     /* NOTE: we write half as many shorts as bytes */
  252.     if ( w == RowIncrement )
  253.     blockoutw( data, ( ( w * h ) + 1 ) >> 1 ) ;
  254.     else if ( w & 1 )         /* MOD 2 == 1 */
  255.     {
  256.     int extrah ;
  257.     unsigned char tchar ;
  258.     int almostw ;
  259.  
  260.     extrah = h & 1 ;
  261.     h >>= 1 ;        /* write half line pairs */
  262.     if ( almostw = --w >> 1 )
  263.     {
  264.         while ( h-- ) {    /* write half line pairs */
  265.         /* WARNING: arg to blockoutw may not be 16-bit
  266.            aligned here ! */
  267.         blockoutw( data, almostw ) ;
  268.         tchar = data[ w ] ;
  269.         data += RowIncrement ;
  270. #if IMAGE_BYTE_ORDER == MSBFirst
  271.         outw( VARDATA, ( tchar << 8 ) | *data ) ;
  272. #else
  273.         outw( VARDATA, tchar | ( ( *data ) << 8 ) ) ;
  274. #endif
  275.         /* WARNING: arg to blockoutw may not be 16-bit
  276.            aligned here ! */
  277.         blockoutw( data + 1, almostw ) ;
  278.         data += RowIncrement ;
  279.         }
  280.         /* WARNING: arg to blockoutw may not be 16-bit aligned here ! */
  281.         if ( extrah )
  282.         blockoutw( data, almostw + 1 ) ;
  283.     }
  284.     else
  285.     {
  286.         while ( h-- )     /* write half line pairs */
  287.         {
  288.         tchar = data[ w ] ;
  289.         data += RowIncrement ;
  290. #if IMAGE_BYTE_ORDER == MSBFirst
  291.         outw( VARDATA, ( tchar << 8 ) | *data ) ;
  292. #else
  293.         outw( VARDATA, tchar | ( ( *data ) << 8 ) ) ;
  294. #endif
  295.         data += RowIncrement ;
  296.         }
  297.         /* WARNING: arg to blockoutw may not be 16-bit aligned here ! */
  298.         if ( extrah )
  299.         {
  300. #if IMAGE_BYTE_ORDER == MSBFirst
  301.         outw( VARDATA, ( *data << 8 ) ) ;
  302. #else
  303.         outw( VARDATA, *data ) ;
  304. #endif
  305.         }
  306.     }
  307.     }
  308.     else
  309.     for ( w >>= 1 ; h-- ; data += RowIncrement )
  310.         blockoutw( data, w ) ;
  311.  
  312.     ibm8514ClearQueue( 3 ) ;    /* following a blockout */
  313.     SETFN1( FNCOLOR1, FNREPLACE ) ;
  314.     PLNWENBL( ibm8514ALLPLANES ) ;
  315.  
  316.     if ( saved )
  317.     ibm8514ReplaceCursor() ;
  318.  
  319.     return ;
  320. }
  321.  
  322. void
  323. ibm8514ReadColorImage( x, y, lx, ly, data, RowIncrement )
  324.      int x ;
  325.      int y ;
  326.      int lx ;
  327.      int ly ;
  328.      unsigned char *data ;
  329.      int RowIncrement ;
  330. {
  331.     int saved ;
  332.  
  333.     TRACE( ( "ibm8514ReadColorImage(x=%d,y=%d,lx=%d,ly=%d,data=x%x,RowIncrement=%d)\n",
  334.         x, y, lx, ly, data, RowIncrement ) ) ;
  335.  
  336.     if ( ( lx <= 0 ) || ( ly <= 0 ) )
  337.     return ;
  338.  
  339.     saved = !ibm8514cursorSemaphore && ibm8514CheckCursor( x, y, lx, ly ) ;
  340.  
  341.     ibm8514ATRNotBusy ;
  342.     ibm8514CheckQueue( 4 ) ;
  343.     PLNWENBL( ibm8514ALLPLANES ) ;
  344.     PLNRENBL( ibm8514ALLPLANES ) ;
  345.     SETMODE( M_DEPTH ) ;
  346.     SETFN1( FNVAR, FNREPLACE ) ;
  347.     ibm8514CheckQueue( 5 ) ;
  348.     SETX0( x ) ;
  349.     SETY0( y ) ;
  350.     SETLX( lx - 1 ) ;
  351.     SETLY( ly - 1 ) ;
  352.     COMMAND( ibm8514ReadZData ) ;
  353.  
  354.     if ( lx == RowIncrement )
  355.     blockinw( data, ( lx * ly ) / 2 ) ;
  356.     /* NOTE: we read half as many shorts as bytes */
  357.     else if ( lx & 1 ) {    /* MOD 2 == 1 */
  358.     unsigned short int shrt ;
  359.     int extrah ;
  360.     int almostw ;
  361.  
  362.     almostw = --lx >> 1 ;
  363.     extrah = ly & 1 ;
  364.     ly >>= 1 ;
  365.     while ( ly-- )            /* write half line pairs */
  366.     {
  367.         blockinw( data, almostw ) ;
  368.         shrt = inw( VARDATA ) ;
  369. #if IMAGE_BYTE_ORDER == MSBFirst
  370.         data[ lx ] = shrt >> 8 ;     /* Top 8 bits         */
  371.         data += RowIncrement ;
  372.         *data = shrt & 0xFF ;     /* Bottom 8 bits     */
  373. #else
  374.         data[ lx ] = shrt & 0xFF ;     /* Bottom 8 bits     */
  375.         data += RowIncrement ;
  376.         *data = shrt >> 8 ;     /* Top 8 bits         */
  377. #endif
  378.         /* WARNING: arg to blockinw may not be 16-bit aligned here ! */
  379.         blockinw( data + 1, almostw ) ;
  380.         data += RowIncrement ;
  381.     }
  382.     if ( extrah )
  383.     {
  384.         blockinw( data, almostw ) ;
  385.         shrt = inw( VARDATA ) ;
  386. #if IMAGE_BYTE_ORDER == MSBFirst
  387.         data[ lx ] = shrt >> 8 ;     /* Top 8 bits         */
  388. #else
  389.         data[ lx ] = shrt & 0xFF ;    /* Bottom 8 bits     */
  390. #endif
  391.     }
  392.     }
  393.     else
  394.     for ( lx >>= 1 ; ly-- ; data += RowIncrement )
  395.         blockinw( data, lx ) ;
  396.  
  397.     ibm8514ClearQueue( 2 ) ;
  398.     SETFN1( FNCOLOR1, FNREPLACE ) ;
  399.     SETMODE( M_ONES ) ;
  400.  
  401.     if ( saved )
  402.     ibm8514ReplaceCursor() ;
  403.  
  404.     return ;
  405. }
  406.